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

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章