Last active
August 29, 2015 14:21
-
-
Save pineoc/7a11340b42c8facbb90b to your computer and use it in GitHub Desktop.
week12_network, select server
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-05-18 | |
week 12 network programming | |
select 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 <sys/select.h> | |
#include <sys/time.h> | |
#define BUF_SIZE 100 | |
void error_handling(char* msg); | |
int main(int argc,char* argv[]) | |
{ | |
int serv_sock,clnt_sock; | |
struct sockaddr_in serv_addr,clnt_addr; | |
socklen_t addr_size; | |
int str_len; | |
struct timeval timeout; | |
fd_set reads,cpy_reads; | |
int fd_max,fd_num,i; | |
char buf[BUF_SIZE]; | |
if(argc!=2) | |
{ | |
printf("Usage error"); | |
exit(1); | |
} | |
serv_sock = socket(PF_INET,SOCK_STREAM,0); | |
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"); | |
FD_ZERO(&reads); | |
FD_SET(serv_sock,&reads); | |
fd_max=serv_sock; | |
while(1) | |
{ | |
cpy_reads=reads; | |
timeout.tv_sec=5; | |
timeout.tv_usec=5000; | |
if((fd_num=select(fd_max+1,&cpy_reads,0,0,&timeout))==-1) | |
break; | |
if(fd_num==0)//timeout | |
continue; | |
for(i=0;i<fd_max+1;i++) | |
{ | |
if(FD_ISSET(i,&cpy_reads))//cpy_reads i index if 1 return true | |
{ | |
if(i==serv_sock) | |
{ | |
addr_size=sizeof(clnt_addr); | |
clnt_sock = accept(serv_sock,(struct sockaddr*)&clnt_addr,&addr_size); | |
FD_SET(clnt_sock,&reads); | |
} | |
if(fd_max<clnt_sock) | |
fd_max=clnt_sock; | |
printf("connected client : %d\n",clnt_sock); | |
} | |
else | |
{ | |
str_len=read(i,buf,BUF_SIZE); | |
if(str_len==0) | |
{ | |
FD_CLR(i,&reads); | |
close(i); | |
printf("Closed client : %d\n",i); | |
} | |
else | |
{ | |
write(i,buf,str_len);//echo | |
} | |
} | |
} | |
} | |
close(serv_sock); | |
return 0; | |
} | |
void error_handling(char* msg) | |
{ | |
fputs(msg,stderr); | |
fputc('\n',stderr); | |
exit(1); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment