Пример кода сокета в C#. net невозможно подключиться - PullRequest
0 голосов
/ 30 апреля 2020

Я планирую написать приложение с использованием сокетов в C# и начал с того, что следовал собственным примерам Microsoft по адресу https://docs.microsoft.com/en-us/dotnet/framework/network-programming/socket-code-examples, но у меня возникают проблемы с их связью.

Я использовал примеры асинхронного сервера и асинхронного клиента, вставив код примера в консольные приложения. net в Visual Studio 2019. Единственным моим изменением в коде было изменение адреса сервера в клиентской программе соответствующим образом. Клиент должен открыть сокет на сервере через порт 11000, отправить короткую тестовую строку, которую сервер возвращает клиенту, и обе стороны выдают консольный вывод в случае успеха. Если я запускаю и клиент, и сервер на одной машине Windows 10, пример работает правильно (клиент настроен на подключение через 127.0.0.1).

Если я запускаю клиента на отдельной машине Windows 10 он не может подключиться к серверу. На сервере не отображаются выходные данные консоли, которые обычно указывали бы на соединение, и точка останова, установленная в примере с сервером, где соединение устанавливается впервые, никогда не срабатывает. Эти две машины нормально взаимодействуют для других задач, например, Windows сетевые ресурсы функционируют правильно между ними.

Я попытался отключить брандмауэр Windows как на сервере, так и на клиентских машинах, и (по совету другого потока) работает Visual Studio как администратор, без изменений в результате. Я использовал NETSTAT на сервере, чтобы убедиться, что никакой другой процесс не пытается использовать порт 11000, и я попытался использовать альтернативные порты.

На стороне клиента программа показывает следующее:

System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (10060): A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 192.168.1.107:11000
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw(Exception source)
   at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
   at AsynchronousClient.ConnectCallback(IAsyncResult ar) in C:\Users\dunca\source\repos\ConsoleClient1\Program.cs:line 87

Я запустил Wireshark на машине на стороне сервера, чтобы попытаться увидеть, что происходит, используя фильтр на Wireshark, чтобы показать связь только между IP-адресами клиента и сервера.

[CLIENT_IP] [SERVER_IP] TCP 66  59959 → 11000 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
[CLIENT_IP] [SERVER_IP] TCP 66  [TCP Retransmission] 59959 → 11000 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
[CLIENT_IP] [SERVER_IP] TCP 66  [TCP Retransmission] 59959 → 11000 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
[CLIENT_IP] [SERVER_IP] TCP 66  [TCP Retransmission] 59959 → 11000 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1

Wireshark на клиентском компьютере показывает то же самое, но с обратными IP-адресами источника и назначения. Похоже, что ACK не возвращается к клиенту, хотя Wireshark видит только то, что проходит через сетевую карту, поэтому возможно, что сервер генерирует ответ, но он блокируется на исходящей стороне серверного компьютера. Однако, как я уже сказал, брандмауэр был полностью отключен (для частных сетей) на обеих машинах.

Я не знаю, что делать дальше, но подозреваю, что это может быть проблема с Windows / Firewall, так как он работает с клиент и сервер работают на одном компьютере.

Редактировать:

Поскольку я работаю из дома, серверный компьютер использует VPN для подключения к моему обычному рабочему месту, и я подозревал, что помехи от этого , Я отключил VPN и полностью отключил брандмауэр Windows, прежде чем повторить эксперимент, с другими результатами. Клиентский компьютер теперь сообщает, что соединение было "активно отклонено", а Wireshark на сервере сообщает следующее ...

[CLIENT_IP] [SERVER_IP] TCP 66  52067 → 11000 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
[CLIENT_IP] [SERVER_IP] TCP 54  11000 → 52067 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0

Да, [RST, ACK] или "Я слышал, и я закрываюсь это соединение. "

РЕДАКТИРОВАТЬ-РЕДАКТИРОВАТЬ: Решено это, серверная программа была привязана к неправильному сетевому адаптеру, поскольку она предполагает, что первый доступный будет правильным.

1 Ответ

0 голосов
/ 30 апреля 2020

Сервер был привязан к неправильному сетевому интерфейсу. Dns.GetHostEntry () возвращает массив сетевых интерфейсов, но пример кода Microsoft слепо выбирает первый в списке. Если я выберу правильный (локальная сеть), то все будет работать между двумя машинами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...