C# 优先套接字通信
我在手机和PC(服务器)之间有一个客户机-服务器通信。 在通信中,我有四个套接字:其中两个用于发送和接收数据,另外两个用于某种形式的保持活动,因为我需要尽可能快地检测断开 只要连接正常,数据传输就不会出现任何问题。但是我想建立一些优先级,以确保keep-alive(记住:两个套接字)通道始终发送数据,除非服务器-客户机之间的连接断开 我怎样才能做到这一点C# 优先套接字通信,c#,sockets,C#,Sockets,我在手机和PC(服务器)之间有一个客户机-服务器通信。 在通信中,我有四个套接字:其中两个用于发送和接收数据,另外两个用于某种形式的保持活动,因为我需要尽可能快地检测断开 只要连接正常,数据传输就不会出现任何问题。但是我想建立一些优先级,以确保keep-alive(记住:两个套接字)通道始终发送数据,除非服务器-客户机之间的连接断开 我怎样才能做到这一点 谢谢您的帮助。当使用TCP传输数据时,只要您尝试发送数据且(TCP)连接中断,TCP协议栈就会通知您。如果您同时控制服务器和客户机代码,则可以
谢谢您的帮助。当使用TCP传输数据时,只要您尝试发送数据且(TCP)连接中断,TCP协议栈就会通知您。如果您同时控制服务器和客户机代码,则可以在TCP数据传输之间很好地实现心跳 如果各个设备上的TCP连接故障检测速度对于您的目的来说太慢,您可以在客户端和服务器之间实现一些单包乒乓方案,如“SNMP回显请求”也称为“ping”-或者如果SNMP不是一个选项,则可能来回发送UDP数据包就可以了
在任何情况下,您都需要某种超时机制(已在TCP堆栈中实现),这意味着断开连接的检测将被延迟,延迟时间以超时持续时间为界。我会用四个套接字质疑您的设置 首先,在远程端死亡时使用单独的连接进行发现并没有给您带来任何好处,但实际上,当“保持活动”连接关闭但“数据”连接仍然完好无损时,会引入竞争条件。在没有活动的情况下,通过相同的数据连接实现周期性心跳 然后,相同节点之间的两个独立数据连接争夺带宽。网络堆栈通常不会跨连接边界进行优化,因此您会得到两倍的TCP开销,而没有任何收益。在同一个TCP连接上实现数据交换—您将获得更好的吞吐量(可能以延迟增加为代价,但只有良好的测量才能说明这一点)
最后,但并非最不重要的一点是,四个连接需要四个侦听TCP端口,因此可能在某个地方的防火墙上存在四个漏洞。将其简化为一个端口,防火墙的管理员将永远是您的朋友。由于网络线路是共享的,您将遇到一些阻塞点。您是否考虑过线程和线程优先级来帮助增加心跳频率?