ネットワークプログラミング:サービス側は複数のクライアントを処理する--マルチプロセス実現、2回のforkはゾンビプロセスを避ける


いくつかのネットワークプログラミングの基本的な概念に関連して、ここでは説明しません.
マルチプロセスで実現し,2回のforkでゾンビプロセスを回避することに重点を置いた.メインプロセスは傍受を担当し、孫プロセスはクライアントとの交流を担当します.
実現する機能は簡単で、クライアント接続に成功した後、整数を入力し、サービス側はそのバイナリ形式を返します.クライアントが0を入力すると、アクティブに終了します.
サービス側コード:
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include 
  
#define PORT 6666  
#define SIZE 50  
  
int Create_socket()         //                 
{  
    int listen_socket = socket(AF_INET, SOCK_STREAM, 0);      //           
    if(listen_socket == -1)  
    {  
        perror("socket");  
        return -1;  
    }  
    struct sockaddr_in addr;  
    bzero(&addr,sizeof(addr));  
      
    addr.sin_family = AF_INET;  //Internet     
    addr.sin_port = htons(PORT);  //   ,htons             
    addr.sin_addr.s_addr = htonl(INADDR_ANY);   //IP  ,       IP  
      
    int ret = bind(listen_socket, (struct sockaddr *)&addr, sizeof(addr));    //    
    if(ret == -1)  
    {  
        perror("bind");  
        return -1;  
    }  
      
    ret = listen(listen_socket, 5);   //        
    if(ret == -1)  
    {  
        perror("listen");  
        return -1;  
    }  
    return listen_socket;  
}  
  
int wait_client(int listen_socket)  
{  
    struct sockaddr_in cliaddr;  
    int addrlen = sizeof(cliaddr);  
    int client_socket = accept(listen_socket, (struct sockaddr *)&cliaddr, &addrlen);//              
    if(client_socket == -1)  
    {  
        perror("accept");  
        return -1;  
    }  
      
    printf("         :%s
",inet_ntoa(cliaddr.sin_addr)); return client_socket; } void talk_client(int client_socket) // , { char buf[SIZE]; while(1) { int ret = read(client_socket, buf, SIZE-1); if(ret == -1) { perror("read"); break; } if(ret == 0) { break; } buf[ret] = '\0'; int temp = atoi(buf); if(temp == 0)     break; int i = 0; int count = 32; while(count--) {     if(1<< count & temp ) buf[i++] = '1';     else buf[i++] = '0';     if(count %8 == 0) buf[i++] = ' '; } buf[i] = '\0'; printf("%s
", buf); write(client_socket, buf, i+1); }     printf("
"); close(client_socket); } int main() // , { int listen_socket = Create_socket(); while(1) { int client_socket = wait_client(listen_socket); int pid = fork(); if(pid < 0) {     perror("fail fork");     break; } else if(pid == 0)// {     if(( pid = fork()) < 0)     {         perror("child process fail fork");         break;     }     else if (pid > 0)         exit(0);// , init ,     talk_client(client_socket); // break; } else// {     close(client_socket);// , }     } close(listen_socket); return 0; }

クライアント:

 #include 
#include 
#include 
#include 
#include 
#include 
#include 


#define PORT 6666
#define SIZE 50
int main()
{
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd == -1)
    {
	perror("socket
"); return -1;     }     struct sockaddr_in addr;     bzero(&addr,sizeof(addr));     addr.sin_family = AF_INET;     addr.sin_port = htons(PORT);     char c[] = "127.0.0.1";     inet_pton(AF_INET,c,(void *)&addr.sin_addr);     int ret = connect(sockfd,(struct sockaddr*)&addr,sizeof(addr));     if(ret == -1)     { perror("connect
"); return -1;     }     printf("
");     char buf[SIZE];     while(1)     { printf(" :"); scanf("%s",buf); write(sockfd,buf,strlen(buf)); if(atoi(buf) == 0)     break; int ret = read(sockfd,buf,sizeof(buf)); if(ret == -1) {     perror("read
");     return -1; } buf[ret] = '\0'; printf(" :%s
",buf);     }     close(sockfd);     return 0; }