Skip to content

Instantly share code, notes, and snippets.

@pineoc
Created April 6, 2015 03:32
Show Gist options
  • Select an option

  • Save pineoc/a03f6feee9ec6c850350 to your computer and use it in GitHub Desktop.

Select an option

Save pineoc/a03f6feee9ec6c850350 to your computer and use it in GitHub Desktop.
/*
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);
}
@pineoc
Copy link
Copy Markdown
Author

pineoc commented Apr 6, 2015

64 line added

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