Created
April 6, 2015 03:32
-
-
Save pineoc/a03f6feee9ec6c850350 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-06 | |
week 6 network programming | |
echo multi process server & client | |
+inet_ntoa function | |
server code | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <signal.h> | |
#include <arpa/inet.h> | |
#include <sys/socket.h> | |
#define BUF_SIZE 32 | |
void error_handling(char* msg); | |
void read_childproc(int sig); | |
int main(int argc,char* argv[]) | |
{ | |
int serv_sock, clnt_sock; | |
struct sockaddr_in serv_addr, clnt_addr; | |
pid_t pid;//process id | |
struct sigaction act;//signal init | |
socklen_t addr_size; | |
int str_len, state; | |
char buf[BUF_SIZE]; | |
if(argc!=2){ | |
printf("Usage : %s <port>\n",argv[0]); | |
exit(1); | |
} | |
//signal setting | |
act.sa_handler=read_childproc; | |
sigemptyset(&act.sa_mask); | |
act.sa_flags=0; | |
state=sigaction(SIGCHLD,&act,0); | |
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 error"); | |
if(listen(serv_sock,5)==-1) | |
error_handling("listen error"); | |
while(1) | |
{ | |
addr_size=sizeof(clnt_addr); | |
clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&addr_size); | |
if(clnt_sock==-1) | |
continue; | |
else | |
{ | |
puts("new client connected...\n"); | |
char* str_ptr = inet_ntoa(clnt_addr.sin_addr); | |
printf("connected client : %s \n",str_ptr); | |
} | |
pid=fork();//process fork | |
if(pid==-1) | |
{//fork error | |
close(clnt_sock); | |
continue; | |
} | |
if(pid==0) | |
{//child | |
close(serv_sock); | |
while((str_len=read(clnt_sock,buf,BUF_SIZE))!=0) | |
write(clnt_sock,buf,str_len); | |
close(clnt_sock); | |
puts("client disconnected..."); | |
return 0; | |
} | |
else//parent | |
close(clnt_sock); | |
} | |
close(serv_sock); | |
return 0; | |
} | |
void read_childproc(int sig) | |
{ | |
pid_t pid; | |
int status; | |
pid=waitpid(-1,&status,WNOHANG); | |
printf("removed proc id: %d \n",pid); | |
} | |
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
64 line added