-2

我正在实现一个服务器,我在其中监听客户端使用接受套接字调用进行连接。

在接受发生并且我收到套接字后,我等待大约 10-15 秒,然后再进行第一次接收/发送调用。

发送到客户端的调用失败,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"); 
}   

谁能告诉这里可能出了什么问题,我们如何防止客户端套接字关闭?

注意 我想在这里添加的一件事是,如果在接受和发送/接收调用之间没有时间间隔或少于 5 秒,则客户端服务器通信按预期进行。

4

2 回答 2

0

在接受发生并且我收到套接字后,我等待大约 10-15 秒,然后再进行第一次接收/发送调用。

为什么?你的意思是客户端需要那么长时间来发送数据?accept()或者您只是在和之间在服务器中闲逛 10-15 秒recv(),如果是,为什么?

发送到客户端的调用失败,errno = 32 即管道损坏。

所以客户端已经关闭了连接。

由于我不控制客户端,因此我SO_KEEPALIVE在接受的套接字中设置了套接字选项。

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

谁能告诉这里可能出了什么问题

客户端正在关闭连接。

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

你不能。

于 2013-06-13T01:05:14.633 回答
0

connect(2)并且send(2)是客户端进行的两个单独的系统调用。第一个发起TCP 三次握手,第二个实际上将应用程序数据排队等待传输。

但是在服务器端,您可以在成功后立即开始向send(2)连接的套接字发送数据(即不要忘记检查)。 accept(2)acceptsock-1

于 2013-06-12T14:45:00.260 回答