Разница между новым TcpClient (MachineName, порт) и новым TcpClient (новый IPEndpoint (..., порт)) - PullRequest
0 голосов
/ 31 марта 2011

Хей Хей,

У меня есть программа .Net, которая должна работать на кластере серверов 2008. Чтобы узнать правильный IP я разрешаю днс по

GetHostEntry(VarDefinedInfConfig).AddressList(0)

но когда я конвертирую свой старый код (этот код выбирает неправильный IP) dns.GetHostName().AddressList(0) => это возвращает виртуальный IP, а не правильный.

Итак, я изменил свой TcpListener на (dns - это параметр из конфигурации)

Dim listener As TcpListener = New TcpListener(New IPEndPoint(Net.Dns.GetHostEntry(dns).AddressList(0), 8001))
listener.Start()

В старом способе tcpclient был определен этим кодом

  Dim client As TcpClient = New TcpClient(Environment.MachineName, 8001)
  Console.WriteLine("Done...")
  client.Close()

Это также подключается к неправильному IP, поэтому я обнаружил перегрузку TcpClient и использовал этот

Новый способ:

 Dim client2 As TcpClient = New TcpClient(New IPEndPoint(Net.Dns.GetHostEntry(dns).AddressList(0), 8001))
    Console.WriteLine("Done")
    client2.Close()

Но когда я использую второй, я получаю исключение "Обычно разрешено только одно использование каждого адреса сокета (протокола / сетевого адреса / порта).

Странная вещь, если я получаю IP-адрес от MachineName, точно такой же, как ip, полученный от dns с параметром.

Кто-нибудь знает причину этого исключения? Обычно они должны иметь одинаковый результат.

Greetz

Jonathan

Ответы [ 3 ]

3 голосов
/ 04 октября 2011

Возможно ли, что вы пропустили основное различие между двумя упомянутыми конструкторами TcpClient ( MSDN )?:

TcpClient (String, Int32) .. подключается к указанному порту на указанном хосте .

TcpClient (IPEndPoint) .. привязывает его к указанной локальной конечной точке .

Таким образом, с помощью первого конструктора сокет открывается на доступном «назначенном ОС» локальном порту, а затем подключается к серверу, чей адрес или DNS-имя и порт передаются в качестве аргументов; после этого вы готовы отправлять или получать данные.

Со вторым конструктором сокет просто открывается на определенном локальном порту (который указан в аргументе конечной точки), но это все - никакого соединения с любым [удаленным или даже локальным] сервером не установлено, потому что информация о сервере отсутствует еще известно; вам нужно вызвать один из методов Connect (.) перед выполнением любых операций связи (аналогично найденному обходному пути).

0 голосов
/ 18 мая 2011

Прямо сейчас я использую работу Arround.Я создаю TcpClient () с пустым конструктором, а затем использую Connect (IPendpoint), и это работает.

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

Почему вы не указываете правильный IP-адрес в конфигурации приложения?

Обычно разрешено только одно использование каждого адреса сокета (протокола / сетевого адреса / порта)

Означает, что кто-то (ваше или другое приложение) уже прослушивает этот ip / порт.

...