套接字断开通知方法

2023-12-01

只是寻找一个可能的解决方案来识别客户端何时断开连接。 我找到了这个:

        public bool IsConnected( Socket s)
    {
        try
        {
            return !(s.Poll(1, SelectMode.SelectRead) &&s.Available == 0);
        }
        catch (SocketException) { return false; }
    }

我在主线程中使用了 while 循环 thread.sleep(500) 并运行 Isconnectedmthod 当我通过 Visual Studio 运行它时它工作正常,当我单击停止调试时它实际上在服务器端程序中通知我,但是当我去时到 bin 目录中的 exe 并启动它 - 它确实通知我连接,但是当我关闭程序(通过“x”按钮手动)或通过任务管理器时IsConnected方法显然返回仍然正确...... 我使用简单的 TCP 连接

        client = new TcpClient();
         client.Connect("10.0.0.2", 10);

server:

Socket s = tcpClient.Client;
        while(true)
        {

            if (!IsConnected(s))


                MessageBox.Show("disconnected");
        }

(顺便说一句,它在线程上运行)。

大家有什么建议吗? 我什至尝试在客户端关闭时关闭连接:

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {

        client.Close();
        s.Close();
        Environment.Exit(0);

    }

不知道该怎么办


你所要求的是不可能的。 TCP 不会报告连接错误,除非尝试send在连接上。如果你的程序所做的只是接收,它永远不会注意到连接不再存在。

此规则有一些与平台相关的例外情况,但没有涉及远程端点的简单消失。

客户端断开连接的正确方法是通过“关闭”操作优雅地关闭连接。在 .NET 中,这意味着客户端代码调用Socket.Shutdown(SocketShutdown.Send)。然后客户端必须继续接收,直到服务器调用Socket.Shutdown(SocketShutdown.Both)。请注意,对于发起关闭的端点,关闭“原因”通常是“发送”,对于确认并完成关闭的端点来说,关闭“原因”通常是“两者”。

每个端点将通过完成接收操作来检测另一个端点已关闭其端点0作为该操作的字节计数返回值。两个端点实际上都不应该close套接字(即调用Socket.Close())直到双向优雅关闭完成。 IE。每个端点都被调用Socket.Shutdown() and看到零字节接收操作完成。

以上就是优雅关闭的工作原理,它应该成为服务器/客户端交互的规范。当然,事情确实会破裂。客户端可能会崩溃,网络可能会断开等。通常,正确的做法是尽可能延迟识别此类问题;例如,只要服务器和客户端不需要实际通信,那么临时网络中断就不会导致错误。在这种情况下,强迫一个人是没有意义的。

换句话说,不要添加代码来尝试检测连接失败。为了获得最大的可靠性,让网络尝试自行恢复。

在一些不太常见的情况下,希望尽早检测到连接故障。在这些情况下,您可以在套接字上启用“保持活动”(强制通过连接发送数据,从而检测连接中断......请参阅SocketOptionName.KeepAlive)或实现某种超时机制(如果在一段时间后没有发送数据,则强制连接失败)。我通常建议不要使用这种技术,但在某些情况下这是一种有效的方法。

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

套接字断开通知方法 的相关文章

  • 如何使用 zlib 制作 .zip 文件

    我正在阅读zlib的文档 它相当详细 但我读到了这一行 输出数据将位于zlib格式 与 gzip 或zip formats http www zlib net zlib how html http www zlib net zlib how
  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 如何将带有自定义分配器的 std::vector 传递给需要带有 std::allocator 的函数?

    我正在使用外部库 pcl 因此我需要一个不会更改现有函数原型的解决方案 我正在使用的一个函数生成一个std vector
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • C 中带有指针的结构的内存开销[重复]

    这个问题在这里已经有答案了 我意识到当我的结构包含指针时 它们会产生内存开销 这里有一个例子 typedef struct int num1 int num2 myStruct1 typedef struct int p int num2
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率

随机推荐

  • Javascript:创建持久绑定函数

    我意识到这样的问题经常被问到 在过去的几天里我可能已经阅读了其中的每一个问题 试图了解如何解决这个问题 但在这种情况下 虽然我相当有信心 但我知道这是为什么发生这种情况 我正在努力实施实际的解决方案 我正在使用 Node js 构建一个小型
  • 使用 alpha png 和背景重复时出现 IE10 伪像

    我在 Windows8 下的 IE10 中遇到以下问题 仅使用带有重复 x 背景的简单 div 并且在使用透明 png 工件时出现 结果 http s18 postimg org 9tn3dlsqx artifacts png 这是示例代码
  • PyCharm 使用海龟出现错误语法错误

    下面的代码工作完美 但是 PyCharm 抱怨语法错误forward 100 usr bin python from turtle import forward 100 done Since turtle是一个标准库我认为我不需要做额外的配
  • 在openlayers3中不使用任何图像绘制箭头

    如何在 Openlayers 3 地图中的矢量图层上绘制箭头 我尝试使用 canvaselement 创建箭头 但不知道如何在 ol3 地图上绘制它 画布元素不是必需的 您可以从以下位置获取箭头示例Openlayers 网站并添加 2 个自
  • ssh 动态端口转发

    我想使用 ssh动态端口转发在我的安卓代码中 我用过图书馆jcraft 但不幸的是这个库不支持动态端口转发并且只是支持本地端口转发 and 远程端口转发 换句话说 我想在我的 android 代码中像这样进行 ssh ssh D 10000
  • javascript按空格分割字符串,但忽略引号中的空格(注意不要也用冒号分割)

    我需要帮助在 javascript 中按空格 分割字符串 忽略引号表达式内的空格 我有这个字符串 var str Time Last 7 Days Time Last 30 Days 我希望我的字符串被分割为 2 Time Last 7 D
  • Rails 子控制器?

    我对 Rails 还很陌生 有一个问题我不太明白 四处寻找架构上 正确 的方法 问题与我所说的子控制器有关 场景是 这 我有一系列页面 其中有一个包含某种形式的面板 一些信息 想想 gitHub 右上角的用户面板 因此 在我的应用程序中 我
  • Oauth2认证成功后获取用户信息

    在我的 iPhone 应用程序中 我使用 google 登录Oauth2 我正在关注这条指令并成功登录 void viewController GTMOAuth2ViewControllerTouch viewController fini
  • 如何反转 Java 中字符串的大小写?

    我想改变一个字符串 使所有大写字符变成小写 所有小写字符变成大写 数字字符将被忽略 所以 AbCdE123 变成 aBcDe123 我想一定有一种方法可以迭代字符串并翻转每个字符 或者也许有一些正则表达式可以做到这一点 Apache Com
  • Sass 中 @if 语句中的 @import

    我只想加载登录页面所需的 css 以提高性能 在我的其他页面上 我想要一个分组的 css 文件 该文件将缓存在包含所有 css 的每个页面上 我有以下文件 minifiedcssforloginpage scss grouped pages
  • Android 模拟按键

    如何以编程方式模拟 Droid 上的按键操作 我想模仿手动按键 在机器人上显示有人正在按键 但它是以编程方式完成的 有一些解决方案涉及IWindowManager 但这在新的 SDK 中不再是一个选项 您可以使用检测 即从活动的 onCre
  • 如何将我自己的 jQuery 版本与浏览器化模块一起使用

    我应该预先澄清 我的问题是关于 Javascript 中的闭包和客户端模块模式 这不是关于如何使用 jQuery noConflict 我有一些 Javascript 人们可以将其添加到他们的网站中 我希望我自己的代码能够访问 变量 该变量
  • Java 中的 Arrays.fill 多维数组

    如何在不使用循环的情况下在 Java 中填充多维数组 我试过了 double arr new double 20 4 Arrays fill arr 0 这导致java lang ArrayStoreException java lang
  • Objective-C SSL 同步连接

    我对 Objective C 有点陌生 但遇到了一个我无法解决的问题 主要是因为我不确定我是否正确实现了解决方案 我正在尝试使用同步连接使用自签名证书连接到 https 站点 我正在得到 错误域 NSURLErrorDomain代码 120
  • NSFetchedResultsController ,其中包含由字符串的第一个字母创建的部分

    在 iPhone 上学习核心数据 关于核心数据用部分填充表视图的示例似乎很少 这核心数据手册示例使用部分 但它们是从模型中的完整字符串生成的 我想按照姓氏的第一个字母将核心数据表组织成多个部分 就像地址簿一样 我可以为每个人创建另一个属性
  • SWF 对象 - 我为什么要使用它

    我的所有网站都需要对搜索引擎友好 即搜索引擎可读 然而 我有点喜欢flash并且希望以友好的方式集成它 我可以选择 swfobject 它允许正确的页面名称并向用户和搜索引擎提供不同的页面 但是 我想知道为什么需要使用 swfobject
  • fmt.Scanf 在 Go 中无法正常工作

    我正在尝试一个应该测试 fmt Scanf 的片段 但它似乎没有按预期工作 package main import fmt time func main fmt Println What is your favorite color var
  • 类型错误:super() 至少需要 1 个参数 [Python 3] [重复]

    这个问题在这里已经有答案了 在下面的代码中 尽管我重新检查了超过 15 分钟 但仍然出现相同的错误 为了您的信息 我在 sublime text 上运行它并出现错误 类型错误 super 至少需要 1 个参数 给定 0 个 代码如下所示 c
  • Fruchterman Reingold 的吸引力如何与 Boost Graph Library 配合使用

    我正在 Boost Graph Library 中学习 Fruchterman Reingold 算法 通过阅读文档 我知道该算法是根据图形布局计算所有节点的位置 但我的问题是我无法理解Boost Graph Library中吸引力的计算步
  • 套接字断开通知方法

    只是寻找一个可能的解决方案来识别客户端何时断开连接 我找到了这个 public bool IsConnected Socket s try return s Poll 1 SelectMode SelectRead s Available