Получить правильный IP-адрес ПК с несколькими сетевыми картами - PullRequest
0 голосов
/ 28 февраля 2011

Hej All, у меня есть приложение, которое прослушивает сокет.Проблема в том, что у компьютера есть 2 сетевые карты, и он подключен к сети компании Netork и к сети PLC. Конечно, мы должны прослушивать / связывать / ... IP-адрес, который мы получили от DHCP в сети компании.

Но когда мы делаем это:

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

Мы получаем IP сети ПЛК.Сейчас мы ищем способ динамически найти правильный IP-адрес.Я уже получил совет, что вы можете привязать сокет к IP-адресу (0: 0: 0: 0), но мы думаем, что это немного рискованно.

У кого-нибудь есть идеи по решению этой проблемы или замечания по поводу 0: 0: 0: 0?

Заранее спасибо.

Джонатан

Ответы [ 3 ]

1 голос
/ 01 марта 2011

Единственный риск, связанный с 0.0.0.0 или оставленный по умолчанию, состоит в том, что вы будете принимать соединения через обе сети. Только вы знаете, является ли тот факт, что представляет собой риск, т. Е. Есть ли в другой сети какие-то вещи, к которым вы не хотите подключаться. Привязка к 0.0.0.0, иначе INADDR_ANY, является практикой по умолчанию и почти универсальной практикой в ​​сетевом программировании.

0 голосов
/ 16 марта 2011

Я позволил пользователю решить, к какому сетевому интерфейсу он / она хочет подключиться, и поместил его в AppSetting.Затем я создаю модуль, который читает файл конфигурации, чтобы решить, к какому сетевому интерфейсу подключиться, а также для проверки и получения IP-адреса. Я использую этот код

в 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();
0 голосов
/ 28 февраля 2011

Не можете ли вы перебрать все адреса и использовать тот, который НЕ 0. * и 168. * (или что бы ни доставлял dhcp ...)

Это следует делать в большинстве (!) Случаев.

...