TcpClient(IPEndPoint localEP),选择正确的localEp?

时间:2012-07-31 18:40:10

标签: c# tcpclient

我让自己疯了。

Microsoft提供了一种使用构造函数绑定新TCPClient的本地网络适配器和端口的绝佳方法:

TcpClient newClient = new TcpClient(IPEndPoint localEP);

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

TcpClient.Connect(IPEndPoint remoteEP)

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

e.g。 :

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

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