【问题标题】:TcpClient(IPEndPoint localEP), choosing correct localEp?TcpClient(IPEndPoint localEP),选择正确的localEp?
【发布时间】:2012-07-31 18:40:10
【问题描述】:

我快把自己逼疯了。

Microsoft 提供了一种非常棒的方式,通过使用构造函数为新的 TCPClient 绑定本地网络适配器和端口:

TcpClient newClient = new TcpClient(IPEndPoint localEP);

给定一个通用的 remoteEndPoint,无论是 IPv4 还是 IPv6,并假设有许多可能的 localEP,似乎没有一种明智的方法来确定在调用之前绑定到哪个 localEP:

TcpClient.Connect(IPEndPoint remoteEP)

.net 确实提供了一个无参数的 TcpClient 构造函数,它会在调用 .Connect 时自动确定哪个 localEP 最好,但不幸的是它不支持 IPv6 目标。

我的第一个想法是访问 IP 路由表并自己确定要使用哪个适配器,但似乎 .net 也没有提供该功能。

我找到了一个涉及到 GetBestInterface() 的 P.Invoke 的解决方案,但不幸的是我需要能够在 Mono 中进行部署,所以真的需要一个托管解决方案。

我的问题/问题是:给定一个已知的 remoteEP,以及所有已知 localEP 的列表,我如何在实例化 tcpClient 时正确选择正确的 localEP,以便连接方法成功。

【问题讨论】:

  • 我不确定你在问什么,你可以:var client = new TcpClient(localEP); client.Connect(remoteEP); 你不清楚为什么提供一个特定的 localEP 并不能确定当前的 localEP绑定到... 您是在问如何确定应该分配哪个 localEP?
  • @PeterRitchie:我已经附加了我的实际问题,很抱歉最初不够清楚。

标签: c# tcpclient


【解决方案1】:

如果您要问的是本地EP 使用什么,您可以使用new IPEndPoint(IPAddress.Any, myPort) 这将绑定到本地计算机上的任何可用IP 地址并使用端口myPort。这样一来,任何东西都可以使用它喜欢的任何 IP 连接到计算机。如果您有多个 IP(例如 NIC),它可以连接,如果我有 IPv4 和 IPv6,它可以连接到任何一个。

例如:

var client = new TcpClient(new IPEndPoint(IPAddress.Any, myPort));

但是,您通常可以只使用new TcpClient();

【讨论】:

  • 我不知道 IPAddress。任何值,我都可以使用它。非常感谢。
猜你喜欢
  • 2011-07-26
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多