微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当有许多网络适配器时,如何找到正确的 IP 地址以用于打开 TCP/IP 服务器端口

如何解决当有许多网络适配器时,如何找到正确的 IP 地址以用于打开 TCP/IP 服务器端口

我找不到用于在我的机器上打开 TCP/IP 服务器端口的正确 IP 地址的代码

出现问题是因为我有很多网络适配器。我有一些创建虚拟网络适配器的虚拟机(例如:HyperV/VirtualBox/VmWare),每个虚拟机都有一个 IP 地址。那么如何避开那些IP地址(正确的网卡)并找到唯一用于访问互联网的真实地址?

当我尝试找到正确的 IP 地址时,我使用此代码获得了虚拟网络适配器卡的 IP 地址而不是物理地址:

IPAddress properIpAddress = null;

NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface networkInterface in interfaces)
{
    var ipProps = networkInterface.GetIPProperties();

    foreach (var ip in ipProps.UnicastAddresses)
    {
        if ((networkInterface.OperationalStatus == OperationalStatus.Up) && (ip.Address.AddressFamily == AddressFamily.InterNetwork))
        {
            if (ip.Address.ToString() == "127.0.0.1")
            {
                continue;
            }

            properIpAddress = ip.Address;
            // Console.Out.WriteLine(ip.Address.ToString() + "|" + networkInterface.Description.ToString());
            Debug.WriteLine(ip.Address.ToString() + "|" + networkInterface.Description.ToString());

            break;
        }
    }

    if (properIpAddress != null)
    {
        break;
    }
}

解决方法

真正的解决方案是不首先搜索适配器。

只需使用 IPAddress.Any 侦听给定端口上的所有接口。

using(TcpListener tcpListener = new TcpListener(IPAddress.Any,somePortNumber))
{
    // some code
}
,

我现在使用的这段代码对我来说很好用,但我不确定它是否防弹。

我分享我的代码作为参考,因为我还没有找到对我有用的东西,除此之外:

IPAddress properIpAddress = null;

NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface networkInterface in interfaces)
{
    var ipProps = networkInterface.GetIPProperties();

    foreach (var ip in ipProps.UnicastAddresses)
    {
        if ((networkInterface.OperationalStatus == OperationalStatus.Up) 
            && (ip.Address.AddressFamily == AddressFamily.InterNetwork) 
            && (ipProps.IsDnsEnabled || ipProps.IsDynamicDnsEnabled))
        {
            if (ip.Address.ToString() == "127.0.0.1")
            {
                continue;
            }

            properIpAddress = ip.Address;
            // Console.Out.WriteLine(ip.Address.ToString() + "|" + networkInterface.Description.ToString());
            Debug.WriteLine(ip.Address.ToString() + "|" + networkInterface.Description.ToString());

            break;
        }
    }

    if (properIpAddress != null)
    {
        break;
    }
}
,

为此我一直在使用以下代码。它为您提供传出连接将使用的 IP:

using (var socket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,0))
{
    socket.Connect("8.8.8.8",65530);
    IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
    return endPoint.Address;
}

但是请注意,它确实打开了一个套接字 - 所以也许应该缓存结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。