【问题标题】:Why must I use default TcpClient to connect to server?为什么我必须使用默认的 TcpClient 连接到服务器?
【发布时间】:2022-01-15 07:46:56
【问题描述】:

使用以下代码,我的客户端无法连接我的服务器:

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) 才能成功建立服务器连接?

【问题讨论】:

  • 用Wireshark观察流量怎么样?
  • @ThomasWeller 我对网络还很陌生,还没有听说过 Wireshark。我去看看。

标签: c# network-programming tcpclient tcplistener


【解决方案1】:

docs

初始化 TcpClient 类的新实例并将其绑定到指定的本地端点。

强调我的。仅当您想控制套接字的本地部分时才使用该构造函数。另请参阅文档的其余部分:

在连接和通信之前,您无需指定本地 IP 地址和端口号。如果您使用任何其他构造函数创建 TcpClient,则底层服务提供者将分配最合适的本地 IP 地址和端口号。

所以你的怀疑是正确的。您基本上是在告诉网络堆栈您希望将套接字的末端绑定到127.0.0.1:0,这不适用于出站连接。

【讨论】:

  • 谢谢你。所以为了清楚起见,如果我愿意,我可以在客户端使用这个带有面向公众 IP 的 TcpClient(IPEndpoint) 构造函数来建立传入(服务器到客户端)连接,对吗?
  • @AldenBernitt:是的
  • @Alden 是的,您需要将其绑定到您的网卡地址之一。不是你的调制解调器的 IP 或任何东西,如果这就是你所说的面向公众的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2016-02-28
  • 2014-08-05
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
相关资源
最近更新 更多