【问题标题】:Prioritized socket communication优先套接字通信
【发布时间】:2016-05-04 04:44:49
【问题描述】:

我在移动设备和 PC(服务器)之间进行了客户端-服务器通信。 在通信中,我有四个套接字:其中两个用于发送和接收数据,另外两个用于某种保持活动状态,因为我需要尽快检测到断开连接。

只要连接正常,数据就会毫无问题地传输。但是我想建立一些优先级,以确保保持活动(记住:两个套接字)通道始终发送数据,除非服务器-客户端之间的连接断开。

我怎样才能做到这一点?

感谢您的帮助。

【问题讨论】:

  • 由于网络线路是共享的,您会遇到一些瓶颈。您是否考虑过线程和线程优先级来帮助提高心跳频率?

标签: c# sockets


【解决方案1】:

我会质疑你的四个插槽的设置。

首先,使用单独的连接来发现远程端何时死亡不会给您带来任何优势,但实际上当“保持活动”连接断开但“数据”连接仍然完好时会引入竞争条件。当没有活动时,通过相同的数据连接实现周期性心跳。

然后相同节点之间的两个独立数据连接竞争带宽。网络堆栈通常不会跨连接边界进行优化,因此您会获得两倍的 TCP 开销而无济于事。通过相同的 TCP 连接实现数据交换 - 您将获得更好的吞吐量(可能会以延迟增加小幅为代价,但只有良好的测量才能证明这一点)。

最后但并非最不重要的一点是,四个连接需要四个侦听 TCP 端口,因此某处的防火墙中可能存在四个漏洞。将其减少到单个端口,该防火墙的管理员将永远是您的朋友。

【讨论】:

    【解决方案2】:

    使用 TCP 进行传输时,您的 TCP 协议栈会在您尝试发送数据并且 (TCP) 连接断开时通知您。如果您同时控制服务器和客户端代码,则可以在通过 TCP 的数据传输之间实现心跳。

    如果相应设备上的 TCP 连接故障检测对于您的目的而言太慢,您可以在客户端和服务器之间实施一些单数据包 ping-pong 方案,例如“SNMP 回显请求”又名“ping” - 或者如果 SNMP 不是一个选项,也许来回发送 UDP 数据包就可以了。

    在任何情况下,您都需要某种超时机制(已在 TCP 堆栈中实现),这意味着断开连接的检测将被延迟,延迟时间受超时持续时间限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      相关资源
      最近更新 更多