我在移动设备和 PC(服务器)之间进行了客户端-服务器通信。在通信中,我有四个套接字:其中两个用于发送和接收数据,另外两个用于某种保持活动状态,因为我需要尽快检测到断开连接。
只要连接正常,数据就会毫无问题地传输。但我想建立一些优先级,以确保保持活动(记住:两个套接字)通道始终发送数据,除非服务器 - 客户端之间的连接已死。
我怎样才能做到这一点?
谢谢你的帮助。
我会质疑你的四个插座的设置。
首先,有单独的连接来发现远程端何时死亡并没有给你任何优势,但实际上当“保持活动”连接断开但“数据”连接仍然完好时会引入竞争条件。当没有活动时,通过相同的数据连接实现定期心跳。
然后相同节点之间的两个独立数据连接竞争带宽。网络堆栈通常不会跨连接边界进行优化,因此您会获得两倍的 TCP 开销而无济于事。通过相同的 TCP 连接实现数据交换 - 您将获得更好的吞吐量(可能会以小延迟增加为代价,但只有良好的测量才能说明这一点)。
最后但并非最不重要的一点是,四个连接需要四个侦听 TCP 端口,因此可能在某处的防火墙中存在四个漏洞。将其减少到单个端口,该防火墙的管理员将永远是您的朋友。
当使用 TCP 进行传输时,您的 TCP 协议栈会在您尝试发送数据并且 (TCP) 连接断开时通知您。如果您同时控制服务器和客户端代码,您可能会在通过 TCP 的数据传输之间实现心跳。
如果 TCP 在各个设备上的连接故障检测对于您的目的来说太慢了,您可以在客户端和服务器之间实施一些单数据包 ping-pong 方案,例如“SNMP echo request”又名“ping” - 或者如果 SNMP 不是一个选项,也许来回发送UDP数据包就可以了。
在任何情况下,您都需要某种超时机制(已在 TCP 堆栈中实现),这意味着断开连接的检测将被延迟,延迟时间受超时持续时间限制。