获取具有多个网卡的pc的正确IP地址

时间:2011-02-28 14:38:31

标签: sockets networking interface hostname

Hej All, 我有一个监听套接字的应用程序。 问题是pc有2个网卡并连接到公司netork和plc网络当然我们必须监听/绑定/ ...到我们从公司网络中的DHCP获得的IP地址。

但是当我们这样做时:

System.Net.IPEndPoint(System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).AddressList(0)

我们获得了PLC网络的IP。现在我们正在寻找一种动态查找正确IPAdress的方法。 我已经得到了一个可以将套接字绑定到IPAdress(0:0:0:0)的提示,但我们认为这样做有点冒险。

有没有人想解决这个问题或有关0:0:0:0的一些评论?

提前致谢。

乔纳森

3 个答案:

答案 0 :(得分:1)

绑定到0.0.0.0或将其保留为默认值的唯一风险是您将通过两个网络接受连接。只有您知道 是否存在风险,即其他网络中是否存在您不希望与您连接的内容。绑定到0.0.0.0,即INADDR_ANY,是网络编程中的默认和接近通用的做法。

答案 1 :(得分:0)

你不能遍历所有地址并使用非0. *和168. *(或者dhcp提供的任何地址......)

在大多数(!)案例中应该这样做。

答案 2 :(得分:0)

我让用户决定他/她想要连接到哪个网络接口并将其放在AppSetting中。 然后我创建一个模块来读取配置文件以决定连接到哪个网络接口,并检查并获取IPAddress我使用此代码

在vb.net中:

 Dim networkinterfaces() As NetworkInterface = NetworkInterface.GetAllNetworkInterfaces()
            Dim found As Boolean = False

            For Each ni As NetworkInterface In networkinterfaces
                If NetworkInterfaceName.Equals(ni.Name) Then
                    If ni.GetPhysicalAddress().ToString().Length > 0 Then
                        IPAddressFromNetworkCard = ni.GetIPProperties.UnicastAddresses(0).Address
                        found = True
                        Exit For
                    End If
                End If
            Next

在c#中(更多的跟踪,但它几乎相同):

Console.WriteLine("Test get ip of interfacecard");
            Console.WriteLine("Give name of interfacecard:");
            string s = Console.ReadLine();


            List<NetworkInterface> nics = NetworkInterface.GetAllNetworkInterfaces().ToList<NetworkInterface>();
            Console.WriteLine(nics.Count + "  networkinterfaces found");

            bool found = false;
            foreach (NetworkInterface ni in nics)
            {
                Console.WriteLine("Available nic: " + ni.Name);
            }
            Console.WriteLine("");
            Console.WriteLine(String.Format("searching for: \"{0}\"", s));
            foreach (NetworkInterface ni in nics)
            {
                if (ni.Name.Equals(s))
                {
                    if (ni.GetPhysicalAddress().ToString().Length > 0)
                    {
                        Console.WriteLine("Network interface found, ipAddress: " + ni.GetIPProperties().UnicastAddresses[0].Address.ToString());
                        found = true;
                        break;
                    }
                }

            }
            if (!found)
                Console.WriteLine(String.Format("\"{0}\" not found", s));

            Console.ReadKey();