一方斷開了網絡另一方卻不知道

最近做以太網打印機的開發,打印機正常的時候一點問題沒有,但是停止打印5分鐘後,再打印,出問題了。

現象是:

1.發送網絡消息都沒有報錯(這暗示我發送成功了)

2.讀網絡消息總是報錯:”由於連接方在一段時間後沒有正確答覆或連接的主機沒有反應,連接嘗試失敗。“

3.重新與以太網卡建立連接後一切恢復正常,即發送和讀取網絡消息都沒有問題。

經過一翻思考後我猜想是這樣的:

1.以太網打印機設置中超過5分鐘沒有網絡消息後網絡連接將自動斷開(這是打印機的以太網卡決定的)

2.對方斷開網絡後,我內存中的socket.Connected是不會變的,因爲根據MSDN的說法,這個值僅表示上一次訪問是否是連接狀態,所以該值不靠譜。

3.以太網卡自動斷開網絡後,當我判斷socket.Connected爲”是“的時候發送網絡請求消息,這個請求其實並沒有發送到目的地,所以後面我再去讀取網絡消息是讀不到的,因爲打印機沒有收到消息更不會返回任何消息。最終導致讀取網絡消息報錯,其實這個錯誤就是說”讀取超時“,在捕獲這個錯誤(SocketException)後,查看其SocketErrorCode發現就是SocketError.TimedOut。

解決方案:

思路:因爲網絡斷開後程序不好做判斷,所以被動重連網絡沒有合適的觸發點,被動不行就主動一點唄,因爲大部分以太網打印機都是默認停止打印機後5分鐘自動斷開網絡,所以我就假設這個條件對所有以太網打印機都成立(即使不成立,5分鐘重新連接一次網絡也沒有副作用)。於是發送網絡消息後就記錄當前時間點,如果下次發送網絡消息時發現距上一次發送的時間超過5分鐘了,那就先重連網絡,再發送網絡消息。

按此思路編碼,問題解決!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章