gpt4 book ai didi

c - TCP 套接字接收指示 "unexpected"成功发送后断开连接

转载 作者:太空宇宙 更新时间:2023-11-04 08:11:54 24 4
gpt4 key购买 nike

我有一个处于阻塞模式的 TCP 套接字,用于请求/响应协议(protocol)的客户端。有时我发现,如果一个套接字在一两分钟内未被使用,则 send 调用会成功并指示已发送所有字节,但随后的 recv 返回零,表示已关闭。我在 Windows 和 Linux 客户端上都看到过这种情况。

服务器人员告诉我,如果他们收到数据,他们总是在关闭前发送一些响应,但如果服务器资源不足,他们可能会关闭尚未收到任何东西的套接字。

我看到的是否表明服务器在我未使用连接时关闭了连接,然后为什么 send 又成功了?

自动检测这种情况的正确方法是什么,以便在这种情况下在新连接上重新发送请求,但请记住,如果服务器实际上两次收到某些请求,可能会产生意想不到的影响?

//not full code (buffer management, wrapper functions, etc...)
//no special flags/options are being set, just socket then connect
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(sock, addr, addrlen);
//some time later after many requests/responses, normally if was inactive for a minute
//sending about 50 bytes for requests, never actually seen it loop, or return 0
while (more_to_send) check(send(sock, buffer, len, 0));
//the very first recv returns 0, never seen it happen part way through a response (few KB to a couple of MB)
while (response_not_complete) check(recv(sock, buffer, 4096, 0));

最佳答案

  • 如果您没有从服务器收到请求的应用程序确认,请重新发送。
  • 将您的交易设计为 idempotent这样重新发送它们就不会造成不良影响。

关于c - TCP 套接字接收指示 "unexpected"成功发送后断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38753903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com