C#遠程主機強迫關閉一個現有鏈接問題簡述

所謂的遠程主機強迫關閉一個現有鏈接,我的理解是:客戶端與服務端之中,有一個率先中斷了已經建立的SOCKET,從而導致連接的另一端被強行關閉鏈接------畢竟你連接的另一端已經關閉了,那你還鏈接個毛啊。

具體問題具體分析。

—————————————————————————————————————————————————————

第二天補充:我的遠程主機強迫關閉一個現有鏈接  問題出現的原因如下:上位機下位機建立連接後,上位機給下位機發送一個數據採集的命令後,下位機直接把連接的端口給復位了,即:下位機關閉了異常連接。

找到問題出現的原因:下位機等待連接的時間,或者是連接上之後等待上位機發送命令的時間稍微一長(比如20秒這個樣子),下位機就會自動復位連接端口(用WIRESHARK抓的包)。

解決方案:沒解決,只是讓用戶關閉軟件重啓一遍算了。畢竟我也搞得不耐煩了------誰還不是大爺咋地?!

—————————————————————————————————————————————————————

以下所講並未直接解決遠程主機強迫關閉一個現有鏈接的問題,只是闡述了此問題產生原因,以及一個應急補救辦法(代價是軟件的友好性,,很差)

我所遇到的問題,或者說我的“遠程主機強迫關閉一個現有鏈接”出現的位置是在一個TRY...CATCH()中捕獲的,其實對程序整體而言沒什麼太大影響,所以我的做法是直接將CATCH中捕獲的的錯誤信息註釋掉。

其次,我看別的大佬給出的解決辦法是在客戶端程序執行完後 READYLINE();或者READAYKEY(); 即保持程序不執行完,防止釋放SOCKET,這樣就不存在SOCKET的兩端有一個率先關閉的問題------但這種方法並不適合我的程序。因爲我的問題是出現在客戶端關閉時,以及下一次打開時。所以READYLINE();是不現實的------我要關閉窗口了還等毛?

但不可否認,對於只是程序執行完就關閉的順序型程序(且不是程序內部處理問題,只是程序執行完而已),以上方法是可以本質上防止遠程主機強迫關閉現有鏈接問題的出現的。

最後,私自分析一下“遠程主機強迫關閉一個現有鏈接”這種問題出現的原因(或者說是代碼中哪裏有疏忽會導致此問題):私以爲,大部分的疏忽或者說是遺漏都是由於SOKET一端先行關閉(這裏以客戶端爲例),而另一端的程序中還有程序段的運行需要依賴建立的連接,且此程序段正在運行,所以會拋出異常。個人認爲最好的辦法是在該程序段錢加上判斷SOCKET還是否存在的判斷。但時間比較緊,且有點懶,不想去查判斷SOCKET狀態或者連接狀態的代碼或者如何如何,等啥時候有時間了在查查吧(或者有大佬如果不吝賜教,那就太好了!!!光明正大喫個白食,嘿嘿)。

第二天補充:只是在CATCH裏面註釋掉是不行的,程序還會報錯的,因爲前邊還是在用CLIENT嘛,所以我直接把提示改成“比比還是把軟件關了重啓吧之類,,云云”

貼一段我的出錯代碼,方便大家和我自己理解。

 Socket client = obj as Socket;
            while (this.IsVisible  )
            {
                byte[] bufferIn = new byte[BytesCounts];  //接收緩存區
                try
                {
                    int length = client.Receive(bufferIn);
                    if (length != 0)
                    {
                        lock (myQueue.SyncRoot)
                        {
                            myQueue.Enqueue(bufferIn);
                        }
                        lock (lenQueue.SyncRoot)
                        {
                            lenQueue.Enqueue(length);
                        }
                    }
                }
                catch (Exception eio)
                {
                   // MessageBox.Show(eio.ToString());   //如果在上位機開啓且已經於下位機通信的情況下,先關閉下位機,會爆出“遠程主機強迫關閉一個現有鏈接錯誤”
                }
            }


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