Last active
August 29, 2015 14:20
-
-
Save pineoc/97622c8754e51cf68f1b 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
/* | |
pineoc, 2015-04-27 | |
week 9 network programming | |
multiThread echo server | |
server code | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <arpa/inet.h> | |
#include <sys/socket.h> | |
#include <pthread.h> | |
#define BUF_SIZE 1024 | |
void error_handling(char* msg); | |
void* do_echo(void* arg); | |
int main(int argc,char* argv[]) | |
{ | |
int serv_sock,clnt_sock; | |
char msg[BUF_SIZE]; | |
int str_len,i; | |
pthread_t t_id; | |
struct sockaddr_in serv_addr,clnt_addr; | |
socklen_t clnt_addr_sz; | |
if(argc!=2) | |
{ | |
printf("Usage :%s <port>\n",argv[0]); | |
exit(1); | |
} | |
serv_sock = socket(PF_INET,SOCK_STREAM,0); | |
if(serv_sock==-1) | |
error_handling("socket() err"); | |
memset(&serv_addr,0,sizeof(serv_addr)); | |
serv_addr.sin_family=AF_INET; | |
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); | |
serv_addr.sin_port = htons(atoi(argv[1])); | |
if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) | |
error_handling("bind() err"); | |
if(listen(serv_sock,5)==-1) | |
error_handling("listen() err"); | |
clnt_addr_sz = sizeof(clnt_addr); | |
for(i=0;i<5;i++) | |
{ | |
clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_sz); | |
if(clnt_sock==-1) | |
error_handling("accept() err"); | |
else | |
printf("connected client %d \n",i+1); | |
pthread_create(&t_id,NULL,do_echo,(void*)&clnt_sock); | |
//close(clnt_sock); | |
} | |
close(serv_sock); | |
return 0; | |
} | |
void error_handling(char* msg) | |
{ | |
fputs(msg,stderr); | |
fputc('\n',stderr); | |
exit(1); | |
} | |
void* do_echo(void* arg) | |
{ | |
int str_len=0; | |
int clnt_sock=*((int*)arg); | |
char msg[BUF_SIZE]; | |
while((str_len=read(clnt_sock,msg,BUF_SIZE))!=0) | |
write(clnt_sock,msg,str_len); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment