如何在服务器上使用分叉子进程重用打开的客户端连接(TCP/IP 套接字)

How to reuse open client connection with forked child process on the server (TCP/IP Socket)

我希望客户端使用 TCP/IP 套接字连接与服务器通信。当服务器端接受连接时,将创建子进程。这个子进程读取并处理传入的数据。我想,当我在打开的连接上从客户端进行后续写入时,如果 doSomething 进程已经退出,服务器端将再次进行分叉。然而发生的事情是,第二个客户端写入(TEST2)写入套接字并且:

a) 写入表明没有错误,但服务器没有收到任何东西 或者

b) 异常断管

我有这样的伪代码:

Client socket side:
{

    socketFD = socket(AF_INET, SOCK_STREAM, 0);
    connect(socketFD, (struct sockaddr *) &serv_addr, sizeof(sockaddr));
    write(socketFD, “TEST1”, strlen(“TEST1”));
    …….
    write(socketFD, “TEST2”, strlen(“TEST2”)); // error: Broken pipe

    .....
    close(sfd);

}

服务器套接字端:doSomething 在分叉的子进程上 运行:

void doSomething(int socket)
{  

    int n;
    const int bufferSize = 1025;
    char buffer[1025];

    bzero(buffer,bufferSize);
    n = read(sock,buffer,bufferSize-1);

}

“TEST2”的写入将失败,并显示消息“broken pipe”。这可能是因为 doSomething 已经完成。问题是:

  1. 在 doSomething 接收并处理完所有 (TEST1) 数据后,如何让分叉(子)进程 doSomething 继续监听?
  2. 如果我让 doSomething 持续监听,如果客户端关闭连接,我如何停止 doSomething?
void doSomething(int socket)
{  

    int n;
    char buffer[1024];
    do
    {
        //Normally your process will be blocked here until it receives some data from the client.
        //The socket must be under the blocking mode;
        n = read(sock,buffer,sizeof(buffer));
        ...do something with the buffer;
    }while(n>0);
}