【问题标题】:Socket example code in C# .net unable to connectC# .net 中的套接字示例代码无法连接
【发布时间】:2020-04-30 07:58:19
【问题描述】:

我计划使用 C# 中的套接字编写一个应用程序,并从 https://docs.microsoft.com/en-us/dotnet/framework/network-programming/socket-code-examples 上的 Microsoft 自己的示例开始,但我遇到了使它们通信的问题。

我在那里使用了异步服务器和异步客户端示例,将示例代码粘贴到 Visual Studio 2019 中的 .net 控制台应用程序中。我对代码的唯一更改是根据需要更改客户端程序中的服务器地址。客户端应该在端口 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 地址和目标 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] 或“我听到了你的声音,我正在关闭此连接。”

EDIT-EDIT:解决了这个问题,服务器程序绑定到错误的网络适配器,因为它假定第一个可用的适配器是正确的。

【问题讨论】:

  • 我认为当您在同一主机上运行服务器和客户端时它连接正常?您是否尝试过 TELNET 到服务器:端口?
  • 客户端和服务器示例在同一台机器上运行时连接。 Telnet 根本不会连接到服务器,即使在服务器机器上也是如此。 “无法在端口 11000 上打开与主机的连接:连接失败”
  • 我会仔细检查客户端目标服务器IP地址的正确性;关于防火墙,使用“允许应用程序通过 Windows 防火墙”选项就足够了,而不是完全禁用它。
  • 另外,请注意您安装的任何 AV 软件。过去我的产品设法干扰了 TCP 连接的建立
  • 我想我看到了问题,当服务器调用 Dns.GetHostEntry(Dns.GetHostName()) 它返回的东西看起来像我的工作 VPN,而不像我的本地网络。看起来服务器绑定到错误的网络接口。 Dns.GetHostEntry() 返回一组网络接口,如果我选择正确的一个(本地网络),那么两台机器之间一切正常。我不知道如何在生产软件中解决这个问题,但现在一切正常,我可以继续开发。

标签: c# sockets tcp


【解决方案1】:

服务器绑定到错误的网络接口。 Dns.GetHostEntry() 返回一个网络接口数组,但是微软的示例代码盲目地选择了列表中的第一个。如果我选择了正确的一个(本地网络),那么两台机器之间一切正常。

【讨论】:

    猜你喜欢
    • 2013-09-29
    • 2018-01-03
    • 2014-03-01
    • 2013-05-21
    • 2021-10-28
    • 2018-03-12
    • 2010-09-15
    • 1970-01-01
    • 2018-11-29
    相关资源
    最近更新 更多