在 .NET 中检测客户端断开连接的最佳实践?

2023-12-26

我正在用 C# 开发一台服务器,它只能接受一个客户端,我需要知道该客户端何时断开连接才能接受另一个连接请求。

我正在使用第一个 Socket,它连续监听连接请求Socket.BeginAccept并接受或拒绝客户。当客户端被接受时,返回的新 SocketSocket.EndAccept用于客户端和服务器之间的通信。然后,服务器等待来自客户端的命令Socket.Begin/EndReceive并发送响应。服务器使用类似 Telnet 的协议,这意味着每个命令和每一行响应都必须以\r\n.

为了检测客户端是否已断开连接,我安装了一个计时器,每 500 毫秒发送一条空消息(“\r\n") 到客户端。如果客户端断开连接,则 Socket 会抛出异常。服务器捕获此异常,关闭当前会话并接受新连接。此解决方案很强大,但意味着网络上不需要的流量,并且必须由客户端正确处理,客户端必须在获得实际响应之前过滤虚拟消息。

我尝试发送一个空缓冲区(Socket.Send(new byte[1], 0, 0)),但似乎在服务器->客户端方向上不起作用。

另一种解决方案可能是处理以下情况Socket.EndReceive返回 0 字节。对于在“空闲”时间内发生的断开连接的情况,它工作得很好。但是,如果客户端在消息传输期间断开连接,服务器并不总是能看到它并无限期地等待。

我已经看到了有关此问题的多个线程和问题,但我从未见过任何好的解决方案。

所以我的问题是:检测 .Net 中断开连接的最佳方法是什么?


唯一的其他选择是,如果是 TCP,则让 TCP 每隔一段时间发送一个保持活动状态,这仍然是轮询,就像您现在正在做的那样,但在 TCP 层处理,因此您的协议不需要知道。

然而,没有办法绕过轮询,因为如果不向其他客户端发送某些内容并获得响应,您就无法知道它是否仍然处于连接状态。

当通过状态数据包检查(例如标准 NAPT)进行通信时,无论如何也可能需要保持活动状态,以避免远程服务器由于不活动而丢弃会话。

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

在 .NET 中检测客户端断开连接的最佳实践? 的相关文章

  • 如何确保使用 Microsoft Sync Framework 同步成功?

    我正在使用微软同步框架 https msdn microsoft com en us sync bb736753 aspx同步两个 Microsoft SQL Server 上的表 我创建了一个测试应用程序 它每秒在远程服务器上的表中生成一
  • 测试项目和配置文件

    我的 Visual Studio 2008 解决方案中有这种设置 一个使用库 Lib1 需要 app config 文件中的一些配置条目 的 WCF 服务项目 WCFService 我有一个单元测试项目 MSTest 其中包含与 Lib1
  • 获取字母数字值的 Max()

    我有一个包含字母数字 ID 的字典 例如 a10a10 和 d10a9 我想要其中最大的 ID 意思是 9 当我使用以下代码时 d10a9 是 MAX 因为 9 排在 10 之前 var lsd new Dictionary
  • 表达式 >.Compile() 的逆向?

    因为我们可以 Expression
  • C#.NET 将解决方案中各个项目的 settings.settings 文件编译为 1 个配置文件

    我有一个解决方案 其中一个项目是业务层 另一个项目是Web前端 其中有BL项目作为参考 它们每个都有自己的 settings settings 文件 但在构建时 BL 配置文件不会复制到 bin 目录中 我们之前解决这个问题的方法是将 BL
  • Winforms 风格/UI 外观和感觉提示

    从多年的 asp net 开发回到 winforms 应用程序 寻找有关如何 设计 winforms 的建议和技巧 类似于我在 asp net 中使用 CSS 母版页的方式 我对如何在一处更新某些类型的控件的字体 颜色感兴趣 如何保持布局的
  • 如何让实体框架初始化新创建的实体上的集合?

    我正在尝试用一些测试数据来种子我的数据库IDatabaseIntialiser像这样 protected override void Seed BlogDataContext context
  • SignTool 错误:访问被拒绝

    我尝试在安装了 VS2010 的 Windows Server 2008 R2 x64 上使用新的代码签名证书对 NET 应用程序进行authenticode 签名 但 SignTool 始终响应访问被拒绝 SignTool exe sig
  • 如何在java中通过socket发送Image数据类型

    我真的很困惑如何通过套接字发送图像数据类型 请帮我 我已经搜索了如何将 Image 数据类型转换为 char 但结果是 0 Use ImageIO http docs oracle com javase 1 4 2 docs api jav
  • gethostbyname() 或 getnameinfo() 如何在后台工作?

    How gethostbyname or getnameinfo 在后台工作 include
  • 为什么 RestSharp 反序列化两个日期的方式不同?

    我有一个返回此值的休息调用 使用 Chrome 中的 Advance Rest Client 进行测试 MyObject 22 0 ID 123456 UTC1 2013 04 19T03 12 32Z UTC2 2013 04 19T03
  • 为什么 .NET 异步等待文件复制比同步 File.Copy() 调用消耗更多 CPU?

    为什么下面的代码会产生 public static class Program public static void Main params string args var sourceFileName C Users ehoua Desk
  • SQL 查询在多用户环境中返回错误值

    一段时间以来 我们在我们的一个客户站点上发现了奇怪的数据完整性问题 经过大量调查后 我们现在已将其隔离为数据库调用 如果两个用户同时调用同一个存储过程 有时一个用户会得到另一个用户的结果 我们设置了一个测试来验证这一点 并且我们有一个循环
  • FOREACH返回的对象顺序稳定吗?

    是否可以安全地假设对同一集合的两次迭代将以相同的顺序返回对象 显然 假设集合没有被更改 这取决于集合类型 对于大多数集合来说 答案是 是 然而 这并不能得到保证 集合类型的文档应该指定它是否这样做 但正如大多数人所做的那样 该细节通常被忽视
  • 自定义 WCF DataContractSerializer

    是否可以用我自己的序列化程序替换 Windows Communication Foundation 中的 dataContractSerializer 如果可能的话 我怎样才能实现这一目标 是的 您可以提供自己的序列化器实现 默认情况下 W
  • 有没有类似 ActiveRecord::Migration for .NET 的东西?

    我玩过 ruby on Rails ActiveRecord Migration类 我喜欢保持数据库模式版本化是多么容易 我想在我的 ASP NET 项目中做类似的事情 我想知道是否有人听说过一个可以执行以下操作的工具ActiveRecor
  • 类型转换 sockaddr 结构

    我正在尝试学习网络编程 并在这个过程中学习C 我对结构感到困惑sockaddr这是一个通用地址 并且sockaddr in 我的书里是这么说的 因此 我们可以填写 sockaddr in 的字段 然后强制转换 a 指向 它指向 指向 soc
  • Netty Nio java 中的通信

    我想在 Netty nio 中创建一个具有两个客户端和一个服务器的通信系统 更具体地说 首先 我希望当两个客户端与服务器连接时从服务器发送消息 然后能够在两个客户端之间交换数据 我正在使用本示例提供的代码 https github com
  • 在 C# 中将 ulong 映射到 long ?

    我正在尝试将 ulong 映射到 long 反之亦然 将 uint 映射到 int 反之亦然 如下所示 为了将值保存在具有签名类型的 MS SQL 数据库中仅限整数和大整数 我这样做是因为我必须检查 在数据库中 一个数字 uint ulon
  • 使用 LINQ to SQL 的 .NET 架构的最佳设计实践(DAL 必要吗?我们真的可以使用 POCO吗?要采用的设计模式吗?)

    我避免在 net arch n 层架构上编写看起来像是另一个线程的内容 但请耐心等待 希望我和其他人一样 在选择用于企业应用程序的架构时 考虑到当今的趋势和新兴技术 仍然没有 100 满意或不清楚应采取的最佳方法 我想我正在寻求大众社区对方

随机推荐