ソケットを特定のネットワーク インターフェイスにバインドするにはどうすればよいですか? setsockopt
サーバー側で使用してみましたが、クライアントは eth0 と lo の両方のインターフェイスを介してサービスにアクセスできます。
を使用して特定の IP アドレスを設定することで、これを実現できます serv_addr.sin_addr.s_addr
。
setsockopt
しかし、(IP アドレスは言及せずに)のみを使用してインターフェイスにバインドできると思います。
SO_BINDTODEVICE
socket オプションを設定することで、特定のインターフェースにバインドできます。
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()で解決できることです。
包括的な例については、後者のリンクをたどってください。
あなたがそれを行うことができる唯一の方法は、あなたが言及することです-
を使用して特定の IP アドレスを設定することによって
serv_addr.sin_addr.s_addr
バインド先のアドレスがわからないとできません。
必要に応じて s を使用ioctl
して現在の IP アドレスを特定することもできますが、最近ではこれを行うより賢い方法があるかもしれません。最近の Linux ディストリビューションではあまり行っていません。