首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重置网络连接

重置网络连接
EN

Stack Overflow用户
提问于 2013-08-06 08:53:06
回答 3查看 6.5K关注 0票数 3

使用C#/.NET重置网络连接的最佳方法是什么?

我的公司有几台机器通过各种方式(3G、wifi、以太网电缆)与客户连接,有时(特别是3G)向Windows报告,它们在没有连接时仍在连接。我有一种方法来检查连接是否真的是活的,但我正在努力重新设置它们。这里有一个问题:

代码语言:javascript
复制
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);
}

正如您所看到的,这将通过所有网络适配器并重置它们,这是我不想做的。此外,一些适配器将不接受空参数。

我可以用这个获得我想要的NetworkInterface对象:

代码语言:javascript
复制
var interfaces = NetworkInterface.GetAllNetworkInterfaces().Where(ni => ni.IsReceiveOnly == false && 
            ni.OperationalStatus == OperationalStatus.Up && ni.NetworkInterfaceType != NetworkInterfaceType.Loopback);

但是NetworkInterface类似乎没有Start()、Stop()、Reset()等方法。我从这里要去哪里?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-06 14:17:50

经过一番搜索和实验,我发现了这篇博文:

在Vista下禁用/启用网络连接

这是一个更好的方法。

其中最重要的是使用一个名为mgmtclassgen.exe的实用程序来围绕WMI Win32_NetworkAdapter类生成一个包装类。在您选择的文件夹的developer命令提示符中使用以下命令:

mgmtclassgen Win32_NetworkAdapter -p NetworkAdapter.cs

生成NetworkAdapter.cs之后,可以将其导入到新项目中,将System.Management.dll添加到项目引用中,并使用以下代码禁用或启用您选择的适配器:

代码语言:javascript
复制
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条目更改为:

代码语言:javascript
复制
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
票数 3
EN

Stack Overflow用户

发布于 2013-08-06 08:58:28

可能有点简单,但您可以从新进程调用ipconfig /renew吗?

代码语言:javascript
复制
Process.Start("ipconfig", "/renew");

或者,这个类似的问题讨论的是使用netsh,我猜您可以从进程中调用netsh(也可以使用如何在C#中以编程方式禁用(或重置)网络适配器 )。

票数 2
EN

Stack Overflow用户

发布于 2013-08-06 09:51:58

您需要Win32 API:

  • GetExtendedTcpTable:获取所有存在的tcp连接。
  • SetTcpEntry:更改tcp连接状态。

示例代码:

代码语言:javascript
复制
MIB_TCPROW row = new MIB_TCPROW();
row.dwState = TcpState.DeleteTcb;
row.dwLocalAddr = ...;
row.dwLocalPort = ...;
row.dwRemoteAddr = ...;
row.dwRemotePort = ...;
SetTcpEntry(ref row);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18075660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档