需求
有一个winform程序,
用来调试路由器和对路由器吞吐量进行测试
需要后台不断的接收来自udp服务器端的数据,同时要发送数据到服务器端(无线路由器)
设计时候,通过一个线程,for(;;)死循环来接收数据,
另一个通过界面按钮发送相关指令(实际情况是
正常流程,没有任何问题.
但是
该流程中,有一个步骤是winform通过http协议上传固件到路由器,
等待路由器重启完毕,
正常流程,是没有任何问题.
但是客户环境,尤其重启期间,测试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信号量,
则发送端线程等待线程终止信号量后重新开启接收线程,再次发送即可.