如何将套接字绑定(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地址。
请点击后一个链接以获取完整示例。