我让自己发疯.
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,从而使连接方法成功.
解决方法:
如果您要问的是对localEP使用什么,则可以使用新的IPEndPoint(IPAddress.Any,myPort).它将绑定到本地计算机上的任何可用IP地址,并使用端口myPort.这样,任何东西都可以使用其喜欢的IP连接到计算机.如果您具有多个IP(例如NIC),则可以连接,如果我具有IPv4和IPv6,则可以连接到任何一个.
例如:
var client = new TcpClient(new IPEndPoint(IPAddress.Any, myPort));
但是,通常可以只使用新的TcpClient();.