首页 文章

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

提问于
浏览
-2

我正在实现一个服务器,我在其中监听客户端使用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 回答

  • 0

    connect(2)send(2)是客户端进行的两个独立的系统调用 . 第一个启动TCP three-way handshake,第二个实际排队应用程序数据以进行传输 .

    但是在服务器端,您可以在成功accept(2)后立即启动send(2) -ing数据到连接的套接字(即不要忘记检查 acceptsock-1 ) .

  • 0

    在接受发生并且我收到套接字后,我等待大约10-15秒,然后再进行第一次recv / send呼叫 .

    为什么?你的意思是客户端需要很长时间才能发送数据吗?或者你只是在服务器中使用 accept() 和_1525417之间的10-15秒,如果是这样,为什么呢?

    对客户端的发送调用失败,错误为32,即管道损坏 .

    所以客户端关闭了连接 .

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

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

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

    客户端正在关闭连接 .

    以及如何阻止客户端套接字关闭?

    你不能 .

相关问题