Skip to content

Instantly share code, notes, and snippets.

@zsrinivas
Last active January 24, 2016 05:11
Show Gist options
  • Save zsrinivas/a47d5797fa0e7621ad29 to your computer and use it in GitHub Desktop.
Save zsrinivas/a47d5797fa0e7621ad29 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/types.h>
#define TRUE 1
#define FALSE 0
int main(int argc , char *argv[])
{
int sock, max_fds, activity;
struct sockaddr_in server;
char msg[1000], sreply[2000];
fd_set readfds, writefds;
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock==-1) {
printf("error: Could not create socket");
}
puts("info: socket created");
server.sin_addr.s_addr = inet_addr(argv[1]);
server.sin_family = AF_INET;
server.sin_port = htons(atoi(argv[2]));
if (connect(sock, (struct sockaddr *)&server, sizeof(server))<0) {
perror("error: connect failed. Error");
return 1;
}
puts("info: Connected\n");
//keep communicating with server
while(1) {
FD_ZERO(&readfds);
FD_SET(sock, &readfds);
FD_SET(0, &readfds);
max_fds=sock;
printf("\rme: ");
fflush(stdout);
activity = select(max_fds+1, &readfds , NULL , NULL , NULL);
if ((activity<0) && (errno!=EINTR)) {
printf("error: select error");
}
if (FD_ISSET(sock, &readfds)) {
if(recv(sock, sreply, sizeof(sreply),0)>0) {
printf("\r%s",sreply);
fflush(stdout);
memset(sreply,0,sizeof(sreply));
}
}
if (FD_ISSET(0, &readfds)) {
memset(msg,0,sizeof(msg));
fgets(msg, sizeof(msg) - 1, stdin);
fflush(stdout);
}
if(send(sock,msg,strlen(msg),0) < 0) {
puts("error: Send failed");
return 1;
}
memset(msg,0,sizeof(msg));
}
close(sock);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>
#define TRUE 1
#define FALSE 0
#define PORT 0
#define MAX 30
int main(int argc , char *argv[])
{
int opt = TRUE;
int ss, addrlen, ns, cs[MAX], activity, i, val, sd, new_socket, j;
int max_fds;
struct sockaddr_in address;
char buffer[MAX][1025];
char client_id_buf[2055];
fd_set readfds;
char *message ="Welcome Clients.\n";
memset(cs, 0, MAX*sizeof(cs[0]));
if((ss = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
if(setsockopt(ss, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) < 0) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(ss, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(ss, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
int tmp_len = sizeof(address);
if (getsockname(ss, (struct sockaddr*)&address, &tmp_len) == -1) {
perror("getsockname");
}
else {
printf("Listener on port %d \n", ntohs(address.sin_port));
}
addrlen = sizeof(address);
puts("Waiting for connections ...");
while(TRUE) {
FD_ZERO(&readfds);
FD_SET(ss, &readfds);
max_fds = ss;
for (i = 0; i < MAX; i++)
{
sd = cs[i];
if(sd > 0)
FD_SET(sd, &readfds);
if(sd > max_fds)
max_fds = sd;
}
activity = select(max_fds + 1, &readfds , NULL , NULL , NULL);
if ((activity < 0) && (errno != EINTR))
{
printf("select error");
}
if (FD_ISSET(ss, &readfds)) {
if ((ns = accept(ss, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0)
{
perror("accept");
exit(EXIT_FAILURE);
}
printf("New connection , socket fd is %d , ip is : %s , port : %d \n" , new_socket , inet_ntoa(address.sin_addr) , ntohs(address.sin_port));
if(send(ns, message, strlen(message), 0) != strlen(message)) {
perror("send");
}
puts("Welcome message sent successfully");
for (i = 0;i < MAX; i++)
{
if(cs[i] == 0)
{
cs[i] = ns;
printf("Adding to list of sockets as %d\n", i);
break;
}
}
}
for (i =0; i < MAX; i++)
{
sd = cs[i];
if (sd > 0) {
if (FD_ISSET(sd, &readfds)) {
if ((val = recv(sd, buffer[i], 1024, 0)) == 0) {
getpeername(sd, (struct sockaddr*)&address, (socklen_t*)&addrlen);
printf("Host disconnected , ip %s , port %d \n" , inet_ntoa(address.sin_addr), ntohs(address.sin_port));
close(sd);
cs[i] = 0;
}
else {
for (j = 0; j < MAX; ++j) {
if (cs[j] > 0 && j != i) {
sprintf(client_id_buf, "client %d: %s", cs[i], buffer[i]);
send(cs[j], client_id_buf, strlen(client_id_buf), 0);
}
}
}
}
}
memset(buffer[i], 0, sizeof(buffer[i]));
}
}
return 0;
}
@zsrinivas
Copy link
Author

compilation comands

gcc client.c -std=c11 -o client
gcc server.c -std=c11 -o server

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment