如何解决当有许多网络适配器时,如何找到正确的 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 举报,一经查实,本站将立刻删除。