我正在实现一个服务器,我在其中监听客户端使用accept套接字调用进行连接 .
在接受发生并且我收到套接字后,我等待大约10-15秒才进行第一次recv / send呼叫 .
对客户端的发送调用失败,errno = 32,即管道损坏 .
由于我不控制客户端,我在已接受的套接字中设置了套接字选项* SO_KEEPALIVE * .
const int keepAlive = 1;
acceptsock = accept(sock, (struct sockaddr*)&client_addr, &client_addr_length)
if (setsockopt( acceptsock, SOL_SOCKET, SO_KEEPALIVE, &keepAlive, sizeof(keepAlive)) < 0 )
{
print(" SO_KEEPALIVE fails");
}
任何人都可以告诉我这里可能出现的问题,我们如何防止客户端套接字关闭?
NOTE 我想在此添加的一件事是,如果在accept和send / recv调用之间没有时间间隔或少于5秒,则客户端服务器通信按预期发生 .
2 回答
connect(2)和send(2)是客户端进行的两个独立的系统调用 . 第一个启动TCP three-way handshake,第二个实际排队应用程序数据以进行传输 .
但是在服务器端,您可以在成功accept(2)后立即启动send(2) -ing数据到连接的套接字(即不要忘记检查
acceptsock
对-1
) .为什么?你的意思是客户端需要很长时间才能发送数据吗?或者你只是在服务器中使用
accept()
和_1525417之间的10-15秒,如果是这样,为什么呢?所以客户端关闭了连接 .
这不会阻止客户端关闭连接 .
客户端正在关闭连接 .
你不能 .