确定进程正在使用的网络适配器

时间:2012-05-28 20:05:11

标签: c# .net networking

我在谷歌上看过几个类似的问题,但没有什么能与我想做的完全匹配。我正在制作一个延迟减少程序(用于游戏),当某个进程打开时,它基本上会降低用户的MTU,并在进程关闭时恢复它。但是,MTU是特定于网络适配器的设置,并且一些用户具有多个连接的网络适配器。为此,我认为让程序检测到游戏正在使用哪个适配器并且仅更改该适配器上的MTU是很好的。

游戏一次只能使用一个适配器。

我无法在终端服务器IP地址中进行硬编码,因为它们会相当频繁地更改。似乎必须是一种在不知道最终IP地址的情况下确定其他进程正在使用哪个适配器的方法,但我似乎无法找到它。

修改: 感谢Cicada和Remco,我已经解决了这个问题。

我使用了Remco链接到(ManagedIpHelper)的ManagedIPHelper类,而Cicada的评论引导我阅读本文(Identifying active network interface

将这些与一些(讨厌的,可怕的未经优化的)LINQ相结合,我得到了这个代码片段,它获取进程名称并返回它正在使用的网络接口,如果找不到,则返回null。

    private NetworkInterface getAdapterUsedByProcess(string pName)
    {
        Process[] candidates = Process.GetProcessesByName(pName);
        if (candidates.Length == 0)
            throw new Exception("Cannot find any running processes with the name " + pName + ".exe");

        IPAddress localAddr = null;
        using (Process p = candidates[0])
        {
            TcpTable table = ManagedIpHelper.GetExtendedTcpTable(true);
            foreach (TcpRow r in table)
                if (r.ProcessId == p.Id)
                {
                    localAddr = r.LocalEndPoint.Address;
                    break;
                }
        }

        if (localAddr == null)
            throw new Exception("No routing information for " + pName + ".exe found.");

        foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
        {
            IPInterfaceProperties ipProps = nic.GetIPProperties();
            if (ipProps.UnicastAddresses.Any(new Func<UnicastIPAddressInformation, bool>((u) => { return u.Address.ToString() == localAddr.ToString(); })))
                return nic;
        }
        return null;
    }

测试确认此作品完美!非常感谢,伙计们!

使用此代码段的任何人的附注:

  • 您需要ManagedIpHelper类。
  • 您的应用可能需要根据具体情况要求提升。
  • 多个正在运行的进程(想想Chrome)将返回一个未定义的结果。如果您打算将此代码用于具有多个流程的情况,我高度建议您将使用(处理p =候选人[0])更改为更多特定过滤器,即基于PID。
  • 您可能还想要实现新的异常类型,例如,您可以更清晰地捕获“无路由信息”,原因是此错误通常只需稍等一下就可以解决(让目标进程打开)连接)然后重试。

1 个答案:

答案 0 :(得分:2)

除了蝉,这必须帮助你:

它是一个围绕某些c / c ++代码的C#包装器,它可以获取所有具有关联PID(进程ID)的打开连接的列表。

http://www.timvw.be/2007/09/09/build-your-own-netstatexe-with-c/

我相信这是唯一的方法,根据可执行路径/名称确定进程(id)并尝试查找该进程的当前连接。