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

我可以通过使用serv_addr.sin_addr.s_addr设置特定的IP地址来实现。

但是我怀疑我们只能使用setsockopt绑定(bind)到接口(interface)(不提及IP地址)。

最佳答案

您可以通过设置SO_BINDTODEVICE套接字选项绑定(bind)到特定接口(interface)。

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功能才能使用此选项。

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

请点击后一个链接以获取完整示例。

08-07 04:05