【问题标题】:How to reuse open client connection with forked child process on the server (TCP/IP Socket)如何在服务器上使用分叉子进程重用打开的客户端连接(TCP/IP 套接字)
【发布时间】:2018-11-01 19:11:29
【问题描述】:

我希望客户端使用 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) 编码客户端以发送“关闭”命令,2) 通常通过心跳握手来实现。
  • 如果我还有(“一段时间”)要写的日期,我想避免关闭连接。
  • 你只需要在完成后关闭连接吗?关闭消息允许您保持服务器进程运行,直到客户端完成它

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


【解决方案1】:
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);
}

【讨论】:

  • 第一个循环没问题。之后它正在等待读取,甚至客户端又进行了 3 次写入。
  • 部分问题是,客户端正在等待服务器响应(消息)。谢谢。
  • 我有一个开源项目,它是一个基于 NIO 技术的 TCP 网络库。您可以在其中看到 TCP 服务器和客户端的现代实现。它的地址是github.com/an-tao/trantor
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多