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