需求
有一個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信號量,
則發送端線程等待線程終止信號量后重新開啟接收線程,再次發送即可.