Created
March 30, 2015 03:11
-
-
Save pineoc/8decfd9cd86ed36addec to your computer and use it in GitHub Desktop.
multi process server & full duplex echo client
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-03-30 | |
week 5 network programming | |
echo multi process server & client | |
client code | |
입출력 분할 | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <arpa/inet.h> | |
#include <sys/socket.h> | |
#define BUF_SIZE 32 | |
void error_handling(char* msg); | |
void read_routine(int sock, char* buf); | |
void write_routine(int sock, char* buf); | |
int main(int argc,char* argv[]) | |
{ | |
int sock; | |
pid_t pid; | |
char buf[BUF_SIZE]; | |
struct sockaddr_in serv_addr; | |
if(argc!=3) | |
{ | |
printf("Usage fail, ip, port"); | |
exit(1); | |
} | |
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=inet_addr(argv[1]); | |
serv_addr.sin_port=htons(atoi(argv[2])); | |
if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1) | |
error_handling("connect error"); | |
pid=fork(); | |
if(pid==0) | |
write_routine(sock,buf); | |
else | |
read_routine(sock,buf); | |
close(sock); | |
return 0; | |
} | |
void read_routine(int sock,char* buf) | |
{ | |
while(1) | |
{ | |
int str_len = read(sock,buf,BUF_SIZE); | |
if(str_len==0) | |
return; | |
buf[str_len]=0; | |
printf("Message from server : %s",buf); | |
} | |
} | |
void write_routine(int sock,char* buf) | |
{ | |
while(1) | |
{ | |
fgets(buf,BUF_SIZE,stdin); | |
if(!strcmp(buf,"q\n")||!strcmp(buf,"Q\n")) | |
{ | |
shutdown(sock,SHUT_WR); | |
return; | |
} | |
write(sock,buf,strlen(buf)); | |
} | |
} | |
void error_handling(char* msg) | |
{ | |
fputs(msg,stderr); | |
fputc('\n',stderr); | |
exit(1); | |
} |
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-03-30 | |
week 5 network programming | |
echo multi process server & client | |
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..."); | |
pid=fork(); | |
if(pid==-1) | |
{ | |
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