3

私は自分自身を狂わせています。

Microsoft は、コンストラクターを使用して新しい TCPClient のローカル ネットワーク アダプターとポートをバインドする素晴らしい方法を提供しています。

TcpClient newClient = new TcpClient(IPEndPoint localEP);

IPv4 または IPv6 のいずれかの一般的な remoteEndPoint が与えられ、可能性のある 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 アドレスにバインドし、ポートを使用しますmyPort。そうすれば、何かが好きな IP でコンピューターに接続できます。複数の IP (NIC など) がある場合は接続できます。IPv4 と IPv6 がある場合は、どちらにも接続できます。

例:

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

ただし、通常はそのまま使用できますnew TcpClient();

于 2012-07-31T18:56:53.373 に答える