UNIX网络编程----多进程并发服务器(这样就支持多个客户端连接了)

来源:互联网 发布:阿里云服务器域名解析 编辑:程序博客网 时间:2024/06/08 12:46

    这个服务器在迭代式echo服务器的基础上增加了多进程功能,因此就可以同时与多个客户端连接并通信了。另外,还加入了SIGCHILD的信号处理机制,防止出现“僵尸进程”。迭代式echo服务器链接


程序源码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <signal.h>

#define MAXLINE 4096
#define SERV_PORT   9877
#define SA  struct  sockaddr
#define LISTENQ 1024

int
main(int argc, char **argv)
{
    int listenfd, connfd;
    char    buf[MAXLINE];
    ssize_t n;
    pid_t   pid;
    pid_t   childpid;
    socklen_t   clilen;
    struct  sockaddr_in cliaddr, servaddr;
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);
    bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
    listen(listenfd, LISTENQ);
    signal(SIGCHLD, sig_chld);
    while(1){
        clilen = sizeof(cliaddr);
        connfd = accept(listenfd, (SA *) &cliaddr, &clilen);
        if((pid == fork()) == 0)
     {
            close(listenfd);
            while(1)
      {
                if((n = read(connfd, buf, MAXLINE)) == 0)
              break;
       
                n = write(connfd,buf,n);
      }
            close(connfd);
            return 0;
     }
        close(connfd);
    }
}

void
sig_chld(int    signo)
{
    pid_t   pid;
    int stat;
   
    while((pid = waitpid(-1, &stat, WNOHANG)) > 0)
        printf("child %d terminated/n", pid);
    return;
}

原创粉丝点击