需求服务器
有一个winform程序,网络
用来调试路由器和对路由器吞吐量进行测试socket
须要后台不断的接收来自udp服务器端的数据,同时要发送数据到服务器端(无线路由器)测试
设计时候,经过一个线程,for(;;)死循环来接收数据,spa
另外一个经过界面按钮发送相关指令(实际状况是线程
正常流程,没有任何问题.设计
可是调试
该流程中,有一个步骤是winform经过http协议上传固件到路由器,orm
等待路由器重启完毕,对象
正常流程,是没有任何问题.
可是客户环境,尤为重启期间,测试PC机由于找不到ap接入点,会去介入其它ap,有可能不是同一网段,致使网络环境已经变动.
此时,udp没法发送,也没法接收.
发送端能够经过udp重连设置.接收端使用的发送端的udp静态对象,但依然没法接收.
不管.NET提供的socket仍是updclient封装udp,都没法很好的处理这种状况.
所以,解决思路就是
经过一个信号量
ManualResetEvent event_ok = new ManualResetEvent(false);
ManualResetEvent event_th = new ManualResetEvent(false);
ok的信号量是用来测试路由器是否通顺,不经过ping的缘由是由于非测试路由器也能够ping通.
每次发送后,等待路由器返回ok的指令,若是没有收到指令,等待信号量超时.
则认为网络中断
设置线程同步变量为false
接收线程当同步变量为false时候,设置th信号量,
则发送端线程等待线程终止信号量后从新开启接收线程,再次发送便可.