Почему я должен использовать TcpClient по умолчанию для подключения к серверу?

#c# #network-programming #tcpclient #tcplistener

#c# #сетевое программирование #tcpclient #tcplistener

Вопрос:

Используя следующий код, моему клиенту не удается подключить мой сервер:

 private static TcpClient client = new TcpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 0));
private static IPEndPoint destinationEp = new IPEndPoint(IPAddress.Parse("192.168.0.100"), 1234);
//...
client.Connect(destinationEp);
 

Использование TcpClient client = new TcpClient() вместо этого будет работать.

В исходном случае я понимаю, что я устанавливаю локальный IP-адрес для локальной машины и использую любой доступный порт в качестве локального порта для облегчения связи. Я подозреваю, что сервер пытается подключиться к клиенту, используя IP-адрес «127.0.0.1», что не сработает, но я не знаю этого наверняка.

Почему я должен использовать new TcpClient() вместо new TcpClient(myEndpoint) для успешного установления соединения с сервером?

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

1. Как насчет использования Wireshark для наблюдения за трафиком?

2. @ThomasWeller Я довольно новичок в работе с сетями и не слышал о Wireshark. Я проверю это.

Ответ №1:

Смотрите Документы:

Инициализирует новый экземпляр класса TcpClient и привязывает его к указанной локальной конечной точке.

Акцент мой. Вы используете этот конструктор, только если хотите управлять локальной частью сокета. Смотрите также оставшуюся часть документации:

Вам не нужно указывать локальный IP-адрес и номер порта перед подключением и обменом данными. Если вы создаете TcpClient с помощью любого другого конструктора, базовый поставщик услуг назначит наиболее подходящий локальный IP-адрес и номер порта.

Итак, ваше подозрение верно. По сути, вы сообщаете сетевому стеку, к которому вы хотите привязать свой конец сокета 127.0.0.1:0 , что не будет работать для исходящих подключений.

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

1. Спасибо вам за это. Итак, чтобы было ясно, если бы я захотел, я мог бы использовать этот конструктор TcpClient (IPEndPoint) с общедоступным IP-адресом на стороне клиента для установления входящего (сервер-клиент) соединения, правильно?

2. @AldenBernitt: да

3. @Alden да, вам нужно привязать его к одному из адресов вашей сетевой карты. Не IP-адрес вашего модема или что-то еще, если это то, что вы подразумеваете под общедоступным.