Last active
January 24, 2016 05:11
-
-
Save zsrinivas/a47d5797fa0e7621ad29 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
compilation comands
gcc client.c -std=c11 -o client
gcc server.c -std=c11 -o server