【发布时间】: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 已经完成。问题是:
- 在 doSomething 接收并处理了所有 (TEST1) 数据后,如何让分叉(子)进程 doSomething 继续侦听?
- 如果我保持 doSomething 持续监听,如果客户端关闭连接,我如何停止 doSomething?
【问题讨论】:
-
1) 编码客户端以发送“关闭”命令,2) 通常通过心跳握手来实现。
-
如果我还有(“一段时间”)要写的日期,我想避免关闭连接。
-
你只需要在完成后关闭连接吗?关闭消息允许您保持服务器进程运行,直到客户端完成它
标签: c sockets c++11 tcp broken-pipe