gpt4 book ai didi

sockets - socket 未正确关闭的原因?

转载 作者:行者123 更新时间:2023-12-03 12:06:53 30 4
gpt4 key购买 nike

这是我正在尝试做的事情:
当有新消息可用时,服务器会将消息发送给已连接的客户端。另一方面,客户端在连接时尝试使用send()向服务器发送消息,然后使用recv()接收消息,此后,客户端调用close()关闭连接。

有时,客户端完成后,服务器尝试从客户端接收消息会导致104-“对等连接重置”错误。发生这种情况时,Wireshark揭示了客户端发送的最后两个段是:
1.确认已收到服务器发送的消息的ACK
2. RST/ACK
客户端不发送FIN。

为什么会发生这种情况,如何在客户端“适当”关闭套接字?

最佳答案

如果您在客户端中调用close()且数据仍在接收队列中,则会发生这种情况。客户端将发送RST而不是FIN,以指示并非所有数据都已成功传递到应用程序。如果连接仅是为了客户的利益,那么服务器可能就不在乎了。由于在该套接字上无法进行进一步的通信,因此服务器应简单地将其关闭。

可以通过如下关闭连接来避免这种情况(其中A是启动关闭的一侧):

  • 当A完成所有数据的发送后,它将调用shutdown(sock, SHUT_WR)并继续从套接字读取。
  • 当B看到EOF(例如recv()返回0)时,它知道A正在启动关机。 B发送任何最终响应或其他最终数据(如果适用),依次调用shutdown(sock, SHUT_WR)close(sock)
  • 当A看到EOF时,如果它已经关闭写入,则仅调用close(sock)

  • 请注意,ECONNRESET仍然是可能的,例如,如果其他进程被杀死,则仍必须对其进行处理。在这种情况下,发送任何最终响应是没有意义的,因为另一端将不会收到它,因此在这种情况下,应仅关闭套接字。

    关于sockets - socket 未正确关闭的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2617314/

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