#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-адрес вашего модема или что-то еще, если это то, что вы подразумеваете под общедоступным.