2013-08-06 88 views
3

使用C#/ .NET重置網絡連接的最佳方法是什麼?重置網絡連接

我的公司有多臺機器與客戶通過各種方式連接(3G,wifi,以太網電纜),有時(尤其是3G)向Windows報告說,他們仍然連接時,他們不是。我有辦法檢查連接是否真的有效,但我正努力重置它們。這裏有一個問題:

var searcher = new ManagementObjectSearcher("select * from Win32_NetworkAdapter"); 
var managementObject = searcher.Get(); 
foreach (ManagementObject obj in managementObject) 
{ 
    var name = obj.Properties["Name"].Value.ToString(); 
    Console.WriteLine(name); 
    obj.InvokeMethod("Disable", null); 
    obj.InvokeMethod("Enable", null); 
} 

正如你所看到的,這將通過所有的網絡適配器,並重置它們,我不想這樣做。此外,一些適配器不會接受null參數。

我能得到的NetworkInterface對象我想這一點:

var interfaces = NetworkInterface.GetAllNetworkInterfaces().Where(ni => ni.IsReceiveOnly == false && 
      ni.OperationalStatus == OperationalStatus.Up && ni.NetworkInterfaceType != NetworkInterfaceType.Loopback); 

但NetworkInterface類好像還沒有開始(),停止(),復位()等方法。我從哪裏出發?

回答

2

一些搜索和實驗後,我發現這個博客帖子:
Disable/Enable Network Connections Under Vista

這是一個更好的方法。

就是這樣,就是使用名爲mgmtclassgen.exe的實用程序來生成圍繞WMI Win32_NetworkAdapter類的包裝類。在開發人員命令提示符在自己選擇的文件夾中使用以下命令:

mgmtclassgen Win32_NetworkAdapter -p NetworkAdapter.cs

你產生NetworkAdapter.cs後,您可以將其導入到一個新的項目,添加System.Management.dll到您的項目引用,並使用下面的代碼來禁用或啓用您選擇的適配器:

SelectQuery query = new SelectQuery("Win32_NetworkAdapter", "NetConnectionStatus=2"); 
ManagementObjectSearcher search = new ManagementObjectSearcher(query); 
foreach(ManagementObject result in search.Get()) 
{ 
    NetworkAdapter adapter = new NetworkAdapter(result); 

    // Identify the adapter you wish to disable here. 
    // In particular, check the AdapterType and 
    // Description properties. 

    // Here, we're selecting the LAN adapters. 
    if (adapter.AdapterType.Equals("Ethernet 802.3")) 
    { 
     adapter.Disable(); 
    } 
} 

也請記住,你的程序將不得不在啓用UAC的任何系統上以管理員身份運行 - 爲此,建議您創建應用程序清單。您可以通過將清單文件中的requestedExecutionLevel條目更改爲:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
+1

太好了,非常感謝您回報 – owen79

+0

我已經將該博客文章的相關數據導入到此答案中,以防博客帖子在將來不再可用。這是這裏的標準做法,請爲您將來的任何答案做好準備。 – caesay

2

可能有點簡單,但你可以從一個新的進程調用ipconfig/renew?

Process.Start("ipconfig", "/renew"); 

另外,關於使用netsh的這種類似的問題的會談,我想你可以從過程太How to disable (or reset) a network adapter programmatically in C#

+0

您對此有多自信?續訂IP地址是否會修復錯誤報告連接的連接? – MrShoes

+0

那麼我沒有測試過,如果這就是你的意思。我的理由是,如果你釋放/更新IP,那麼你將要回收網絡接口。如果捕獲進程的退出代碼,它可能會顯示是否成功重置適配器。 沒有重複你遇到的問題將難以明確表明這將修復它 – owen79

+0

好的謝謝。原則上聽起來很合理。 – MrShoes

1

調用您需要的Win32 API:

示例代碼:

MIB_TCPROW row = new MIB_TCPROW(); 
row.dwState = TcpState.DeleteTcb; 
row.dwLocalAddr = ...; 
row.dwLocalPort = ...; 
row.dwRemoteAddr = ...; 
row.dwRemotePort = ...; 
SetTcpEntry(ref row);