1. 程式人生 > >C#之解決 未處理的“System.InvalidOperationException”型別的異常出現在 System.dll中...

C#之解決 未處理的“System.InvalidOperationException”型別的異常出現在 System.dll中...

今天在寫一個C#埠掃描器,執行程式時,出現了以下的錯誤提示資訊:

未處理的“System.InvalidOperationException”型別的異常出現在 System.dll 中。

其他資訊: 斷開套接字連線後,只能通過非同步方式再次重新連線,

而且只能連線到不同的 EndPoint。在操作完成前,在將不會退出的執行緒上必須呼叫 BeginConnect。


截圖如下:


我的主要程式碼如下:
try
   {
    //連線埠
    tcpClient.Connect(ip, port);

   }

catch (System.Net.Sockets.SocketException ex)
    {              
                   
    }



網上百度了一下,碰到的該問題的人還真不少,解決的方法寥寥幾個字,我只好自己找錯誤的原因了...

我解決該問題的思路是:捕獲異常資訊,看看是什麼導致了該問題的發生

捕獲程式碼如下
 try
    {
        //連線埠
        tcpClient.Connect(ip, port);

     }

catch (System.Net.Sockets.SocketException ex)
     {              
        MessageBox.Show(ex.ToString());
                   
     }


捕獲截圖如下:



分析以上截圖
從中可以知道,原來我們的程式已經連線上了目標主機的21埠,

在下一輪掃描,即掃下一個埠22時,因一個TcpClient只能連線一個埠,

而我們的TcpClient物件已經連上了目標主機的21埠,所在在掃22埠時,

程式自動將我們的TcpClient物件給關閉了,卻沒有再new一個TcpClient物件賦給我們之前用的TcpClient物件,

所在我們再次用之前的TcpClient物件連線目標主機的22埠時,

因Tcplient已經關閉,從而導致了以下異常的發生:


分析完後,我們看看解決方法:

知道了原因後,問題就容易解決了,在我們的TcpClient物件連線上目標主機的埠後,

我們主動將我們的TcpClient物件關閉掉,然後再new一個TcpClient物件給我們之前關閉的TcpClietn物件,

呵呵,這叫做置之死地而後生...

修改後的程式碼如下:

try
   {
     //連線埠
     tcpClient.Connect(ip, port);

   
//連線成功時,關閉tcpClient,為下一輪掃描做準備
    //tcpClient.Close();

   
//讓tcpClient獲得重生,可以無異常地進行下一輪掃描了
    tcpClient = new System.Net.Sockets.TcpClient();
                   
    }
 catch (System.Net.Sockets.SocketException ex)
       {              
         
                   
        }