优先插座通信

时间:2012-11-07 17:09:08

标签: c# sockets

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

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

我怎样才能做到这一点?

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

我会用四个插座来质疑你的设置。

首先,使用单独的连接来发现远程终端何时没有给你任何好处,但事实上当“保持活动”连接断开但“数据”连接仍然完好时引入竞争条件。当没有活动时,在相同的数据连接上实现定期心跳。

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

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

答案 1 :(得分:0)

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

如果各个设备上的TCP连接故障检测速度太慢,您可以在客户端和服务器之间实现一些单数据包乒乓方案,如“SNMP回应请求”又称“ping” - 或者SNMP不是一个选项,可能来回发送UDP数据包就可以了。

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