套接字呼叫之间的时间差,即。 Accept()和recv / send calls

时间:2013-06-12 11:40:36

标签: sockets tcp broken-pipe

我正在实现一个服务器,在其中我使用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秒,则客户端服务器通信按预期发生。

2 个答案:

答案 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

这不会阻止客户端关闭连接。

  

有谁能告诉我这里可能出现的问题

客户端正在关闭连接。

  

我们如何防止客户端套接字关闭?

你不能。