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

2024-04-25

我想为我的 TCP/IP 客户端类提供 CheckConnection 函数,以便我可以检查是否发生了错误(我自己的客户端断开连接、服务器断开连接、服务器卡住等)。
我有类似的东西:

bool isConnectionActive = false;
if (Client.Poll(100000, SelectMode.SelectWrite) == true)
  isConnectionActive = true;

根据 MSDN 所说:

SelectWrite:true,如果处理一个Connect(EndPoint),并且连接成功; - 或 - 如果可以发送数据,则为 true;否则,返回 false。

要点是,使用简单的服务器应用程序对此进行测试,即使服务器侦听器已关闭并且服务器应用程序已关闭,我从 CheckConnection 中得到的结果始终为 true;这很奇怪,因为我预计在这些情况下,不会处理任何连接(几分钟前就已经连接)并且无法发送数据。

我已经使用 Poll 与 SelectRead 和 Available 的组合在服务器端实现了类似的连接检查,并且它似乎工作正常;那么现在,我应该在客户端写类似的东西吗? SelectWrite 方法是否正确(但我使用不当)?


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

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

这通常被称为TCP 半开 https://en.wikipedia.org/wiki/TCP_half-open问题。

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

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

一些不发送大量数据的应用程序实现保持活动协议,它们只是每分钟发送/接收几个字节,因此它们知道远程端点存在。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# - 从客户端检查 TCP/IP 套接字状态 的相关文章

随机推荐

  • 使用 sprintf 打印元素数量可变的向量

    在下面的代码中 我可以打印向量中的所有元素item用空格分隔为 item 123 456 789 sprintf d d d item ans 123 456 789 我怎样才能做到这一点而不必输入那么多 d作为元素的数量item 最简单的
  • AWS S3 列表键以字符串开头

    我在 AWS Lambda 函数中使用 python 列出以特定 id 开头的 s3 存储桶中的键 for object in mybucket objects all file name os path basename object k
  • 使用 Electron 和 Systemjs 导入节点模块

    我只是想知道如果系统js在自己的注册表中找不到该模块 是否可以让systemjs使用require remote require nodemodule 我认为当使用带有 typescript 和 commonjs 模块的 Electron
  • 一个包中的多个模块导入一个公共模块

    我正在写一个 python 包 我使用插件的概念 每个插件都是 Worker 类的专门化 每个插件都被编写为模块 脚本 并在单独的进程中生成 由于插件之间的基本共性 例如 所有插件都扩展基类 Worker 插件模块通常如下所示 import
  • 为什么 VBA 中的 GetValue 函数使用单元格“A1”?

    我正在使用此函数从关闭的工作簿中检索值 在此代码的第 8 行中 我不明白为什么使用 A1 整个第 8 行到底发生了什么 我也对 xlR1C1 的论点感到困惑 Private Function GetValue path file sheet
  • 使用 C# 将 JSON 字符串从 Camel 大小写转换为 Pascal 大小写

    我有一个 JSON 字符串 它的密钥采用驼峰式大小写形式 但我需要将密钥转换为帕斯卡式大小写 实际的 JSON 字符串 string jsonString personName firstName Emma lastName Watson
  • Android TabWidget 检测当前选项卡的点击

    我正在尝试找到一种方法 当该选项卡是当前选项卡时 能够在该选项卡上触发 onclick 事件 我确实尝试过这种方式 以及其他几种方式 但没有成功 public void onTabChanged String tabId Log d thi
  • 在 Java 中使用 JSON 的 HTTP POST

    我想在 Java 中使用 JSON 制作一个简单的 HTTP POST 假设网址是www site com 它接受值 name myname age 20 标记为 details 例如 我将如何创建 POST 语法 我似乎也无法在 JSON
  • 背景 x 重复负边距重叠

    实际上是我关于堆栈的第一个问题 我试图在重复背景上获得负 右 边距 这样重复图像之间就不会出现间隙 似乎没有 CSS 语法来实现这一点 为了清楚起见 我在下面添加了一张图片 所以我试图让类似饼干的东西的重复图像重叠 这样它们之间就没有间隙
  • 如果我们在更大的表中使用广播会发生什么?

    我想知道如果我们广播较大的表并将其加入到较小的表中会发生什么 另外 如果我们有两个同样大的表 在这种情况下使用广播连接会发生什么 有几件事需要考虑 火花上限 Spark支持最大8GB的广播表 如果你的广播对象超过这个数量 它就会失败 驱动程
  • 最新的CEDET版本无法加载语义包

    我在加载 Alex Ott 推荐的一些语义包时遇到问题他著名的 CEDET 指南 http alexott net en writings emacs devenv EmacsCedet html使用最新版本的 CEDET 时 我之前的设置
  • 在Python 3中从CGI输出二进制数据

    这个问题与this one https stackoverflow com q 908331 554319 我在从 Python 2 中的 CGI 脚本打印原始二进制数据时没有遇到任何问题 例如 usr bin env python2 im
  • 一元加号和减号运算符的重要用途是什么?

    如果一元 运算符用于执行转换Number 转换函数 那么为什么我们需要一元运算符呢 这些一元运算符有什么特殊需要 一元论 运算符将其操作数转换为 Number 类型 一元论 运算符将其操作数转换为 Number 类型 然后将其取反 根据EC
  • Sublime 代码折叠注释(如 Ace 中)

    在 Cloud9 基于 Ace 编辑器 中 我可以在注释中定义任意代码折叠区域 例如 Descriptor function Code 折叠为 Descriptor lt gt 在这里尝试看看我的意思 http ace c9 io buil
  • ModelClientValidationRule 冲突

    我已将 vs 2011 开发人员预览版与 vs 2010 并排安装 现在 当我在 vs 2010 中运行我的 asp net mvc 3 项目时 我在使用 ModelClientValidationRule 的项目中收到以下错误 Syste
  • 在线代码美化器和格式化程序[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在一个函数中返回两个变量[重复]

    这个问题在这里已经有答案了 考虑以下代码 demo http jsfiddle net m59Fg function test var h Hello var w World return h w var test test alert t
  • Mono 与 CompletableFuture

    CompletableFuture在单独的线程上执行任务 使用线程池 并提供回调函数 假设我有一个 API 调用CompletableFuture 这是 API 调用阻塞吗 线程会被阻塞直到它没有从 API 得到响应吗 我知道主线程 tom
  • 这是从片段中获取字符串资源的正确方法吗?

    在片段中读取字符串资源时 哪种方法通常更好 更安全 我在这里读到getResources getString 直接地 public class SomeFragment extends Fragment public static Some
  • C# - 从客户端检查 TCP/IP 套接字状态

    我想为我的 TCP IP 客户端类提供 CheckConnection 函数 以便我可以检查是否发生了错误 我自己的客户端断开连接 服务器断开连接 服务器卡住等 我有类似的东西 bool isConnectionActive false i