我快把自己逼疯了。
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,以便连接方法成功。