2012-11-07 50 views
2

我有一个移动和PC(服务器)之间的客户端 - 服务器通信。 在通信中,我有四个套接字:其中两个用于发送和接收数据,另外两个用于某种保持活动,因为我需要尽可能快地检测断开连接。优先插座通信

只要连接正常,数据就会毫无问题地传播。但我想确定一些优先级,以确保活着(记住:两个套接字)通道总是发送数据,除非服务器 - 客户端之间的连接已经死亡。

我该如何做到这一点?

感谢您的任何帮助。

+0

由于网络线路是共享的,您将碰到一些障碍点。您是否考虑过线程和线程优先级来帮助增加心脏跳动的频率? –

回答

5

我会怀疑你的设置与四个套接字。

首先,单独的连接用于发现远程端死时没有任何优势,但事实上当“保持活动”连接断开但“数据”连接仍然完好时引入竞争状态。没有活动时,通过相同的数据连接实施定期心跳。

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

最后但并非最不重要的四个连接需要四个监听TCP端口,因此可能在防火墙的某个地方有四个孔。减少到单个端口,该防火墙的管理员将永远是你的朋友。

0

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

如果TCP在各个设备上的连接失败检测对于您的目的来说太慢,您可以在客户端和服务器之间实现一些单包ping-pong方案,如“SNMP回应请求”又名“ping” - 或者SNMP不是一种选择,可能来回发送UDP数据包将会有所斩获。

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