1. 服務器進程
//增加了signal 和 wait
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h>
#define MAXLINE 1024
#define SERVER_PORT 9877
typedef void sigfunc(int);
/*
* struct sigaction{
* void (*sa_handler)(int);
* sigset_t set_mask;
* int flag;
* void (*sa_sigaction)(int ,siginfo_t *,void *);
* }
*
*/
sigfunc *signal(int signo,sigfunc *func)
{
struct sigaction act,oact;
act.sa_handler = func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if( signo == SIGALRM){
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
}else{
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART;
#endif
}
if(sigaction(signo,&act,&oact) < 0){
return (SIG_ERR);
}
return (oact.sa_handler);
}
void sig_child(int signo)
{
pid_t pid ;
int stat ;
pid = wait(&stat);
printf("child %d terminated \n",pid);
return ;
}
void str_echo(int sockfd)
{
ssize_t n;
char buf[MAXLINE] = {0};
while((n = read(sockfd,buf,MAXLINE)) >0 ){
write(sockfd,buf,n);
}
}
int main(int argc,char *argv[])
{
int listenfd,connfd;
pid_t childpid ;
socklen_t len;
struct sockaddr_in cliaddr,servaddr;
listenfd = socket(AF_INET,SOCK_STREAM,0);
//void bzero(void *s,size_t n)
bzero(&servaddr,sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERVER_PORT);
// bind(int,struct sockaddr *,socklen_t)
bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
signal(SIGCHLD,sig_child);
//listen(int sockfd,int backlog);
listen(listenfd,5);
for( ; ;){
len = sizeof(cliaddr);
// int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen)
connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&len);
if( (childpid = fork()) == 0){
close(listenfd);
str_echo(connfd);
exit(0);
}
close(connfd);
}
return 0;
}
socket基本套接字2(signal和wait)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.