gpt4 book ai didi

C# - 从客户端检查 TCP/IP 套接字状态

转载 作者:行者123 更新时间:2023-12-04 10:40:13 26 4
gpt4 key购买 nike

我想为我的 TCP/IP 客户端类提供一个 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 方法是否正确(但我使用不当)?

最佳答案

您可以检查很多东西,但没有一个可以保证给您提供您正在寻找的结果。即使您在服务器上的实现也不会 100% 工作。我保证它有一天会失败。

有 FIN 数据包,应该从客户端发送到服务器,当连接关闭时,反之亦然,但不能保证这些数据包会被传递,甚至被处理。

这通常称为 TCP Half Open问题。

关闭 TCP 套接字是一个双方同意的过程,您通常有一个消息传递协议(protocol),它告诉另一端它正在关闭,或者您有一些预定义的指令集,然后您关闭。

100% 检测远程套接字是否关闭的唯一可靠方法是向其发送一些数据。只有当您收到错误消息时,您才会知道套接字是否已关闭。

一些不发送大量数据的应用程序实现了keep-alive协议(protocol),它们只是每分钟发送/接收几个字节,因此它们知道远程端点存在。

从技术上讲,您可以让两台服务器处于连接状态并且 10 年没有相互发送数据。每一端都继续相信另一端在那里,直到尝试发送一些数据并发现它不是。

关于C# - 从客户端检查 TCP/IP 套接字状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59964679/

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