C#之解決 未處理的“System.InvalidOperationException”型別的異常出現在 System.dll中...
阿新 • • 發佈:2019-01-11
今天在寫一個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埠時,
知道了原因後,問題就容易解決了,在我們的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)
{
}
未處理的“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());
}
捕獲截圖如下:
分析以上截圖
在下一輪掃描,即掃下一個埠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)
{
}