Я планирую написать приложение с использованием сокетов в 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] или "Я слышал, и я закрываюсь это соединение. "
РЕДАКТИРОВАТЬ-РЕДАКТИРОВАТЬ: Решено это, серверная программа была привязана к неправильному сетевому адаптеру, поскольку она предполагает, что первый доступный будет правильным.