我正在实现一个服务器,在其中我使用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");
}
有人可以告诉我这里可能出现的问题,我们怎样才能防止客户端套接字关闭?
注意 我想在此添加的一件事是,如果在accept和send / recv调用之间没有时间间隔或少于5秒,则客户端服务器通信按预期发生。
答案 0 :(得分:0)
connect(2)
和send(2)
是客户端进行的两个独立的系统调用。第一个启动TCP three-way handshake,第二个实际上将应用程序数据排队等待传输。
但是,在服务器端,您可以在成功 send(2)
后立即启动accept(2)
数据到连接的套接字(即不要忘记检查{{1}反对acceptsock
)。
答案 1 :(得分:0)
接受发生并且我收到套接字后,我等待大约10-15秒才进行第一次recv / send呼叫。
为什么呢?你的意思是客户端需要很长时间才能发送数据吗?或者你只是在accept()
和recv()
之间在服务器上玩了10-15秒,如果是这样,为什么呢?
对客户端的发送调用失败,并且errno = 32,即管道损坏。
因此客户已关闭连接。
由于我不控制客户端,我在已接受的套接字中设置了套接字选项
SO_KEEPALIVE
。
这不会阻止客户端关闭连接。
有谁能告诉我这里可能出现的问题
客户端正在关闭连接。
我们如何防止客户端套接字关闭?
你不能。