1

私は Ubuntu 12.04 を実行しており、現在、sendtoを使用してさまざまな宛先にパケットを送信する UDP ソケットを作成する C++ コードを作成しています。今、私のラップトップにwlan0eth0の両方のインターフェースがあることがあります。IP アドレスと SO_BINDTODEVICE オプションを使用してこれらのいずれかにバインドすると、送信先アドレスに応じて、sendtoは、適切であれば他のインターフェイスを使用することを決定します。

具体的には、UDP ソケットを IP アドレスとポートを使用して eth0 インターフェイスにバインドし、パケットを別のラップトップ (ローカルで、wifi アクセスのみ) に送信すると、wlan0 インターフェイスの使用が決定されます。

この動作には長所があることは理解していますが、オフにできるようにしたいと考えています。つまり、割り当てた 1 つのインターフェイスのみを使用するようにソケットに指示できるようにしたいと考えています。

提案?

編集:

struct sockaddr_storage sa = address;
fd = socket(address.get_family(), SOCK_DGRAM, 0);
char *devname = "wlan0";
setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, devname, strlen(devname));
bind(fd, (sockaddr*)&sa, len);
4

1 に答える 1

1

SO_BINDTODEVICE または bind を使用してソケットをインターフェイスにバインドすると、受信したパケットのフィルターが定義されます。指定されたインターフェイスを使用して受信されなかったパケットは、ソケットの受信キューに渡されません。参照: http://linux.die.net/man/7/socket

ただし、ソケットをインターフェイスにバインドしても、通常の IP ルーティング プロセスには影響しません。パケットを送信するとき、最適なルートを見つけてハードウェア アダプター経由で IP パケットを送信するのは、ネットワーク IP スタックの役割です。これはイーサネット アダプタの場合もありますが、バインド操作を伴うコントローラではありません。

特定のインターフェイスでパケットを送信する場合は、生のソケットが必要です。IP とハードウェア レイヤー (おそらくイーサネット) を含む完全なパケット コンテンツを構築し、raw ソケットを使用して送信します。

于 2013-10-21T13:56:21.563 に答える