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

时间:2018-11-01 19:11:30

标签: c sockets c++11 tcp broken-pipe

我希望客户端使用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”的写入将失败,并显示消息“管道损坏”。这可能是因为doSomething已经完成。问题是:

  1. 在doSomething接收并处理了所有(TEST1)数据之后,我如何保持分叉的(子)进程doSomething进行监听?
  2. 如果我保持doSomething持续监听,如果客户端关闭连接,如何停止doSomething?

1 个答案:

答案 0 :(得分:0)

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);
}