23

ソケットを特定のネットワーク インターフェイスにバインドするにはどうすればよいですか? setsockoptサーバー側で使用してみましたが、クライアントは eth0 と lo の両方のインターフェイスを介してサービスにアクセスできます。

を使用して特定の IP アドレスを設定することで、これを実現できます serv_addr.sin_addr.s_addr

setsockoptしかし、(IP アドレスは言及せずに)のみを使用してインターフェイスにバインドできると思います。

4

3 に答える 3

33

SO_BINDTODEVICEsocket オプションを設定することで、特定のインターフェースにバインドできます。

struct ifreq ifr;

memset(&ifr, 0, sizeof(ifr));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "eth0");
if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) {
    ... error handling ...
}

警告:このオプションを使用するには、root 権限が必要です。CAP_NET_RAW

2 つ目の方法は、インターフェイスに関連付けられた IP アドレスをgetifaddrs()で解決できることです。

包括的な例については、後者のリンクをたどってください。

于 2013-01-23T11:31:07.603 に答える
2

あなたがそれを行うことができる唯一の方法は、あなたが言及することです-

を使用して特定の IP アドレスを設定することによってserv_addr.sin_addr.s_addr

バインド先のアドレスがわからないとできません。

必要に応じて s を使用ioctlして現在の IP アドレスを特定することもできますが、最近ではこれを行うより賢い方法があるかもしれません。最近の Linux ディストリビューションではあまり行っていません。

于 2013-01-23T11:11:13.887 に答える