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

2021-06-14 02:54:42 字數 812 閱讀 3714

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

現象是:

1.傳送網路訊息都沒有報錯(這暗示我傳送成功了)

2.讀網路訊息總是報錯:」由於連線方在一段時間後沒有正確答覆或連線的主機沒有反應,連線嘗試失敗。「

3.重新與乙太網卡建立連線後一切恢復正常,即傳送和讀取網路訊息都沒有問題。

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

1.乙太網印表機設定中超過5分鐘沒有網路訊息後網路連線將自動斷開(這是印表機的乙太網卡決定的)

2.對方斷開網路後,我記憶體中的socket.connected是不會變的,因為根據msdn的說法,這個值僅表示上一次訪問是否是連線狀態,所以該值不靠譜。

3.乙太網卡自動斷開網路後,當我判斷socket.connected為」是「的時候傳送網路請求訊息,這個請求其實並沒有傳送到目的地,所以後面我再去讀取網路訊息是讀不到的,因為印表機沒有收到訊息更不會返回任何訊息。最終導致讀取網路訊息報錯,其實這個錯誤就是說」讀取超時「,在捕獲這個錯誤(socketexception)後,檢視其socketerrorcode發現就是socketerror.timedout。

解決方案:

思路:因為網路斷開後程式不好做判斷,所以被動重連網路沒有合適的觸發點,被動不行就主動一點唄,

因為大部分乙太網印表機都是預設停止印表機後5分鐘自動斷開網路,所以我就假設這個條件對所有乙太網印表機都成立(即使不成立,5分鐘重新連線一次網路也沒有***)。於是傳送網路訊息後就記錄當前時間點,如果下次傳送網路訊息時發現距上一次傳送的時間超過5分鐘了,那就先重連網路,再傳送網路訊息。

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

Linux檢視網絡卡UUID另一方法

有時我們不小心將 etc sysconfig network scripts ifcfg eth0 可以通過此檔案進行檢視uuid 刪除或者損壞,要重新編輯ifcfg eth0檔案時不知道網絡卡的uuid是什麼 當然也可以不寫 那我們還有什麼方法可以檢視網絡卡的uuid呢?在這裡我們使用的方法是使用...

js開發遇到在方法中呼叫另一方法問題

eas crm dayi webcontent ecp page template entitylist.js 基礎指令碼 eas crm dayi webcontent brandmarket page matchreply matchreply.js自己寫的指令碼 entitylist.js中有...

js開發遇到在方法中呼叫另一方法問題

eas crm dayi webcontent ecp page template entitylist.js 基礎指令碼 eas crm dayi webcontent brandmarket page matchreply matchreply.js自己寫的指令碼 entitylist.js中有...