C# - 从客户端检查 TCP/IP 套接字状态
C# - Check TCP/IP socket status from client side
我想为我的 TCP/IP 客户端 class 提供 CheckConnection 函数,以便我可以检查是否发生了错误(我自己的客户端断开连接、服务器断开连接、服务器卡住、 ...).
我有这样的东西:
bool isConnectionActive = false;
if (Client.Poll(100000, SelectMode.SelectWrite) == true)
isConnectionActive = true;
根据 MSDN 的说法:
SelectWrite: true, if processing a Connect(EndPoint), and the connection has succeeded; -or- true if data can be sent; otherwise, returns false.
要点是,使用简单的服务器应用程序对此进行测试,我从 CheckConnection 得到的结果总是正确的,即使服务器侦听器已关闭,即使服务器应用程序已关闭;这很奇怪,因为我预计在这些情况下既没有连接正在处理(几分钟前已经连接)也没有数据可以发送。
我已经在服务器端使用 Poll 与 SelectRead 和 Available 的组合实现了类似的连接检查,它似乎工作正常;所以现在,我应该在客户端也写类似的东西吗? SelectWrite 方法是否正确(但我使用不当)?
您可以检查很多东西,但 none 肯定会给您想要的结果。即使是你在服务器上的实现也不会在 100% 的时间内工作。我保证它总有一天会失败。
有 FIN 数据包,当连接关闭时,应该从客户端发送到服务器,反之亦然,但不能保证这些将被传递,甚至不能被处理。
这通常称为 TCP Half Open 问题。
关闭 TCP 套接字是一个双方同意的过程,您通常有一个消息协议告诉另一端它正在关闭,或者您有一些预定义的指令集然后关闭。
100% 检测远程套接字是否关闭的唯一可靠方法是向其发送一些数据。只有当你返回错误时,你才知道套接字是否已关闭。
一些不发送大量数据的应用程序实现了保持活动协议,它们只是每分钟 send/receive 几个字节,所以它们知道远程端点存在。
从技术上讲,您可以拥有两台处于连接状态且 10 年未相互发送数据的服务器。每一端都继续相信另一端在那里,直到有人尝试发送一些数据并发现它不存在。
我想为我的 TCP/IP 客户端 class 提供 CheckConnection 函数,以便我可以检查是否发生了错误(我自己的客户端断开连接、服务器断开连接、服务器卡住、 ...).
我有这样的东西:
bool isConnectionActive = false;
if (Client.Poll(100000, SelectMode.SelectWrite) == true)
isConnectionActive = true;
根据 MSDN 的说法:
SelectWrite: true, if processing a Connect(EndPoint), and the connection has succeeded; -or- true if data can be sent; otherwise, returns false.
要点是,使用简单的服务器应用程序对此进行测试,我从 CheckConnection 得到的结果总是正确的,即使服务器侦听器已关闭,即使服务器应用程序已关闭;这很奇怪,因为我预计在这些情况下既没有连接正在处理(几分钟前已经连接)也没有数据可以发送。
我已经在服务器端使用 Poll 与 SelectRead 和 Available 的组合实现了类似的连接检查,它似乎工作正常;所以现在,我应该在客户端也写类似的东西吗? SelectWrite 方法是否正确(但我使用不当)?
您可以检查很多东西,但 none 肯定会给您想要的结果。即使是你在服务器上的实现也不会在 100% 的时间内工作。我保证它总有一天会失败。
有 FIN 数据包,当连接关闭时,应该从客户端发送到服务器,反之亦然,但不能保证这些将被传递,甚至不能被处理。
这通常称为 TCP Half Open 问题。
关闭 TCP 套接字是一个双方同意的过程,您通常有一个消息协议告诉另一端它正在关闭,或者您有一些预定义的指令集然后关闭。
100% 检测远程套接字是否关闭的唯一可靠方法是向其发送一些数据。只有当你返回错误时,你才知道套接字是否已关闭。
一些不发送大量数据的应用程序实现了保持活动协议,它们只是每分钟 send/receive 几个字节,所以它们知道远程端点存在。
从技术上讲,您可以拥有两台处于连接状态且 10 年未相互发送数据的服务器。每一端都继续相信另一端在那里,直到有人尝试发送一些数据并发现它不存在。