socket基本套接字2(signal和wait)

来源:互联网 发布:傲剑金蛇数据 编辑:程序博客网 时间:2024/06/06 15:04
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    9877typedef 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;}
0 0
原创粉丝点击