如何从服务器优雅地关闭套接字

本文关键字:套接字 服务器 | 更新日期: 2023-09-27 18:11:48

在服务器端,我正在尝试优雅地关闭连接的套接字。我知道Socket上事件的正确顺序应该是:

  1. socket Shutdown。发送选择

  2. 循环/等待直到socket Receive返回0字节

  3. 套接字关闭

我有几个问题:

  1. what if Socket。接收从不返回(0字节)?我们会被困在试图永远关闭插座吗?

  2. 每当我在服务器上调用Close时,客户端总是收到"现有连接被远程主机强制关闭"的异常。我怎样才能"优雅地"通知客户端这个关闭?

  3. 在服务器上,如果我使用异步开始/EndReceive调用,每当我在套接字上调用Close时,它总是在开始/EndReceive线程上导致ObjectDisposedException。是否没有办法关闭套接字而不发生此异常?

如何从服务器优雅地关闭套接字

  1. TCP协议保证套接字将最终关闭,除非对端拒绝允许它关闭。在这种情况下,你应该永远等待,或者放弃,无论如何。

  2. 如果在receive返回0后关闭套接字,则不应该发生这种情况。

  3. 当异步操作正在或可能正在使用资源时,不能释放资源。与其说关闭,不如说关闭。在100%使用完资源之前,不要调用close。