3

我快把自己逼疯了。

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,以便连接方法成功。

4

1 回答 1

3

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

例如:

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

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

于 2012-07-31T18:56:53.373 回答