web-dev-qa-db-ja.com

Windowsのソケットに特定のネットワークインターフェイスを使用する

ルーティングテーブルを変更する以外に、新しく作成されたソケットに特定のネットワークインターフェイスを使用させるための信頼できる方法はWindowsにありますか?インターフェイスのIPアドレスへのbind()がこれを保証しないことを理解しています。

20
Ofir

(2回目はラッキーです。)

参考までに、ここに別の質問があります 同じ回線に沿って特定のネットワークアダプタ でconnect()を実行します...

The Cable Guy によると

Windows XPおよびWindowsServer®2003は、すべてのIPv4インターフェイスの送受信に弱いホストモデルを使用し、すべてのIPv6インターフェイスの送受信に強いホストモデルを使用します。この動作を構成することはできません。 WindowsVistaおよびWindowsServer2008の次世代TCP/IPスタックは、Teredoホスト固有のリレーのTeredoトンネリングインターフェイスを除くすべてのインターフェイスで、IPv4とIPv6の両方の強力なホスト送受信をデフォルトでサポートします。

したがって、Windows XPおよびWindowsServer 2003 IP4ではありませんが、IP6ではあります。WindowsVistaおよびWindows 2008ではあります(特定の状況を除く)で質問に(今回は適切に)答えます。

また、 http://www.codeguru.com/forum/showthread.php?t=487139 から

Windowsでは、bind()の呼び出しは、カードの選択に影響を与えるのは着信トラフィックのみであり、発信トラフィックには影響しません。したがって、マルチホームシステム(つまり、複数のインターフェイスカード)で実行されているクライアントでは、使用するカードを選択するのはネットワークスタックであり、宛先IPのみに基づいて選択を行います。ルーティングテーブル上。 bind()を呼び出しても、カードの選択にはまったく影響しません。

それは「ウィークエンドシステム」(「ウィークE/S」)モデルと呼ばれるものと関係があります。 Vistaは強力なE/Sモデルに変更されたため、Vistaでは問題が発生しない可能性があります。しかし、以前のバージョンのWindowsはすべて、弱いE/Sモデルを使用していました。

弱いE/Sモデルでは、マルチホームシステムの発信トラフィックに使用するカードを決定するのはルーティングテーブルです。

これらのスレッドが何らかの洞察を提供するかどうかを確認してください。

「WindowsのマルチホームホストでのローカルソケットバインディングXPは機能しません」 http://www.codeguru.com/forum/showthread.php?t=452337)

「指定したネットワークカードにポートを接続するにはどうすればよいですか?」 http://www.codeguru.com/forum/showthread.php?t=451117 で。このスレッドでは、CreateIpForwardEntry()関数について説明しています。この関数を使用して、ルーティングテーブルにエントリを作成し、指定したサーバーとのすべての発信IPトラフィックが指定したアダプターを介してルーティングされるようにすることができます。

http://www.codeguru.com/forum/showthread.php?t=448863 の「2枚のイーサネットカードの操作」

http://www.codeguru.com/forum/showthread.php?t=452368 の「マルチホームシステムでの奇妙なバインド動作」

お役に立てば幸いです。

18
Ezz