我让自己疯了。
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方法成功。
答案 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();