将套接字绑定到networking接口

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

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

但是我怀疑我们只能使用setsockopt绑定一个接口(不提IP地址)。

Solutions Collecting From Web of "将套接字绑定到networking接口"

您可以通过设置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功能才能使用此选项。

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

按照后面的链接进行全面的例子。

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

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

你不能不知道要绑定的地址。

如果需要的话,可以使用ioctl来确定当前的IP地址,但是近来可能有一个更聪明的方法来实现这一点 – 最近我在现代Linux发行版中没有做太多的工作。