我计划在C#中使用套接字编写一个应用程序,并从遵循微软在https://docs.microsoft.com/en-us/dotnet/framework/network-programming/socket-code-examples上自己的示例开始,但我遇到了让它们进行通信的问题。
我在那里使用了异步服务器和异步客户端示例,将示例代码粘贴到Visual Studio2019中的.net控制台应用程序中。我在代码中唯一的更改是适当地更改了客户机程序中的服务器地址。客户端应该在端口11000上打开到服务器的套接字,发送一个简短的测试字符串,服务器返回给客户端,成功时两端都会给出控制台输出。如果我在同一台Windows10机器上同时运行客户机和服务器,则该示例工作正常(客户机设置为通过127.0.0.1连接)。
如果我在单独的Windows10计算机上运行客户端,它无法连接到服务器。服务器上不会出现通常会指示连接的控制台输出,并且不会命中服务器示例中首次建立连接的断点。这两台机器在执行其他任务时可以正常通信,例如,它们之间的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地址和目的IP地址颠倒了。看起来没有ACK返回给客户端,尽管Wireshark只看到通过网卡的内容,因此有可能服务器正在生成响应,但它在服务器机器的传出端被阻止。然而,正如我所说的,防火墙在两台机器上都被完全禁用(用于专用网络)。
我对下一步要尝试什么感到困惑,但我怀疑这可能仍然是Windows/防火墙的问题,因为它可以在同一台机器上运行客户端和服务器。
编辑:
当我在家工作时,服务器机器正在使用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或者“我听到你的声音了,我要关闭这个连接。”
编辑-编辑:解决了这个问题,服务器程序绑定到了错误的网络适配器,因为它假设第一个可用的适配器是正确的。
发布于 2020-04-30 16:45:36
服务器绑定到错误的网络接口。Dns.GetHostEntry()返回一个网络接口数组,但是微软的示例代码盲目地选择列表中的第一个接口。如果我选择了正确的一个(本地网络),那么所有东西都可以在两台机器之间工作。
https://stackoverflow.com/questions/61518547
复制相似问题