web-dev-qa-db-ja.com

ソケットをネットワークインターフェイスにバインド

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

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

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

17
user2003595

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() で解決できることです。

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

24
Davide Berra

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

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

バインドするアドレスがわからなければ、それを行うことはできません。

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

3
Joe