将套接字绑定到网络接口

use*_*595 17 c sockets linux

如何将套接字绑定到特定的网络接口?我尝试setsockopt在服务器端使用,但客户端仍然可以通过eth0和lo接口访问服务.

我可以通过设置特定的IP地址来实现这一点 serv_addr.sin_addr.s_addr.

但我怀疑我们只能使用绑定到接口setsockopt(不提IP地址).

Dav*_*rra 22

您可以通过设置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 ...
}
Run Code Online (Sandbox Code Playgroud)

警告:您必须是root用户CAP_NET_RAW才能使用此选项.

第二种方法是您可以使用getifaddrs()解析绑定到接口的IP地址.

请按照后一个链接获取全面的示例.

  • 您好 https://linux.die.net/man/3/setsockopt 未列出 SO_BINDTODEVICE 是否不再受支持? (2认同)

Joe*_*Joe 3

你能做到的唯一方法就是你提到的 -

通过使用设置特定的IP地址serv_addr.sin_addr.s_addr

如果不知道要绑定的地址,您就无法做到这一点。

ioctl如果需要,您可以使用s 来确定当前的 IP 地址,尽管现在可能有一种更聪明的方法来做到这一点 - 我最近在现代 Linux 发行版中没有做太多事情。