Серверное приложение получает неверный ipHostInfo.Список адресов[0]

#c# #server #tcp

Вопрос:

У меня есть серверное приложение Изображение сервера приложений слева, тот же хост, что и клиент справа.

Если я запущу его на сервере, приложение просто не будет взаимодействовать с клиентом. Я пытаюсь разрешить все порты, используемые в брандмауэре, а также все приложение, но это не помогло. На локальном хостинге это работает нормально. Рабочая система корректно обновлена Win 10. Сервер-Windows server 2012.

 public void Listen(object data)
    {
  // Establish the local endpoint for the socket.  
    // The DNS name of the computer  
    // running the listener is "host.contoso.com".  
    IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
    // Create a TCP/IP socket.  
    Socket listener = new Socket(ipAddress.AddressFamily,
            SocketType.Stream, ProtocolType.Tcp);

        // Bind the socket to the local endpoint and listen for incoming connections.  
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(100);

            while (true)
            {
                // Set the event to nonsignaled state.  
                allDone.Reset();

                // Start an asynchronous socket to listen for connections.  
                Console.WriteLine("Waiting for a connection...at"   localEndPoint.ToString());
                listener.BeginAccept(
                    new AsyncCallback(AcceptCallback),
                    listener);

                // Wait until a connection is made before continuing.  
                allDone.WaitOne();
            }

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

        Console.WriteLine("nPress ENTER to continue...");
        Console.Read();
 

Комментарии:

1. Это адреса IPv6. Вы проверили настройки брандмауэра IPv4 и IPv6? Вы намеревались использовать IPv6? Кроме того, на левой картинке он прослушивает «::1″…

2. Похоже, у сервера нет адреса IPv6… как заставить его использовать IPv4 ?

3. А-а-а, дай-ка я посмотрю это, быстро. Прошла целая вечность с тех пор, как я делал это вручную.

4. IP-адрес IP-адрес = ipHostInfo. Список адресов[0]; В первой позиции находится IPv6-адрес IPAddress IPAddress = ipHostInfo. Список адресов[1]; На второй позиции находится IPv4-адресное серверное связанное разрешение на запись, которое я могу дать вам разрешение 🙂

5. Если вы не пытаетесь привязаться к определенному адресу, вы можете просто использовать IPAddress.Any его при создании своей конечной точки.

Ответ №1:

Похоже, вам следует использовать адреса IPv4.

Вы можете использовать свойство IPAdress AdressFamily, чтобы получить действительный IPv4-адрес («Интернет»). Также проверьте isLoopback() .

Итак, в основном

 IPAdress myIp = ipHostInfo
                  .AddressList
                  .Where( a => a.AddressFamily == AddressFamily.InterNetwork)
                  .FirstOrDefault(x => !IPAdress.IsLoopback(x));
 

должен дать вам хороший, если он существует.

или, как Damien_The_Unbeliever так сильно напомнил мне в комментарии: просто используйте IPAdress.Any для прослушивания любой ip-адрес.