IP-адрес. Любой сбой - PullRequest
       5

IP-адрес. Любой сбой

2 голосов
/ 06 августа 2010

). Сегодня я столкнулся с некоторыми проблемами с TcpListener. Вещи странные. Первоначально я использовал новый конструктор TcpListener (port), но он был помечен как устаревший. Поэтому я бросил его и использовал вместо этого:

   IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
   IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, ServerPort);
   TcpListener tcpServer = new TcpListener(ipLocalEndPoint);

   _TCPClient = tcpServer.AcceptTcpClient();
   GotClient();

Конечно, я делаю это в потоке, чтобы оно не блокировало приложение. Теперь, что происходит, это то, что, хотя ipAddress правильный, сервер НИКОГДА не принимает ЛЮБОЕ входящее соединение.

ОДНАКО , переход на новый IPEndPoint (IPAddress.Any, ServerPort), кажется, делает свое дело! Что глупо двумя способами:

  1. 2 часа назад, IPAddress.Any возвратил 192.168.1.102, который является моим правильным локальным IP. Это тот же IP, который был в ipAddress! Но с ipAddress он не работал, а с IPAddress. Любой работал (то есть успешно принимал соединения от моего клиента).

  2. Прямо сейчас: IPAddress.Any возвращает 0.0.0.0 (!? ), в то время как переменной ipAddress по-прежнему назначается мой правильный IP-адрес (192.168.1.102). Результат? Мой клиент по-прежнему не может подключиться при использовании ipAddres, но подключается при использовании IPAddress.Any, даже если это 0.0.0.0.

Я полностью озадачен этим ... Есть мысли?

В настоящее время у меня есть это в Form_HandleCreated, но это было странно, когда я это делал и в конструкторе Form.

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: Я думаю, что ошибаюсь насчет IP-адреса. Любое возвращение 192.168.1.102. Я, вероятно, распечатал что-то еще, так как многие из вас указали, что 0.0.0.0 - это то, что должно вернуться. Извините :: - Д.

Ответы [ 3 ]

8 голосов
/ 06 августа 2010

IPAddress.Any должен вернуть 0.0.0.0, это нормально. Вы действительно уверены, что он вернул что-то еще изначально?

Что касается того, почему вы не могли подключиться раньше, если вы слушали 192.168.1.102 и пытались подключиться к 127.0.0.1 (localhost), то это не будет работать. Вам необходимо прослушать 127.0.0.1, если вы хотите подключиться к этому IP-адресу.

По сути, вы должны прослушивать IP-адрес, к которому вы пытаетесь подключиться. Прослушивание 0.0.0.0 означает «прослушивание всех доступных IP-адресов». Помните, что 127.0.0.1 (localhost) не является синонимом «IP моей локальной сети».

4 голосов
/ 06 августа 2010

0.0.0.0 - это пустой IP-адрес, означающий «Мне все равно, какой IP-адрес вы бы использовали», то есть вы хотите прослушивать все интерфейсы. Документально подтверждено, что должно вернуть его.

Для последующего редактирования: Прежде всего, не звоните [0]. Ваше имя хоста может не иметь никакой связанной записи. Даже если это вам а) не известен порядок б) вы не знаете, где они находятся (т. Е. Это может быть только 127.0.0.1, т. Е. Зацикливание).

На моно такой код работает (проверено с помощью netstat и т. Д.):

using System;
using System.Net;
using System.Net.Sockets;

public class test {
    public static void Main(String[] args) {
        IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
        IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 8888);
        TcpListener tcpServer = new TcpListener(ipLocalEndPoint);
        tcpServer.Start(); // Without this line there is exception
        var _TCPClient = tcpServer.AcceptTcpClient();
    }
}
1 голос
/ 06 августа 2010

Я предполагаю, что всегда возвращает 0.0.0.0 ...

...