如何将套接字绑定到特定的网络接口?我尝试在服务器端使用setsockopt
,但客户端仍然可以通过eth0和lo接口访问服务。将套接字绑定到网络接口
我可以通过使用serv_addr.sin_addr.s_addr
设置特定的IP地址来实现此目的。
但我怀疑我们可以绑定到仅使用setsockopt
(不提及IP地址)的接口。
如何将套接字绑定到特定的网络接口?我尝试在服务器端使用setsockopt
,但客户端仍然可以通过eth0和lo接口访问服务。将套接字绑定到网络接口
我可以通过使用serv_addr.sin_addr.s_addr
设置特定的IP地址来实现此目的。
但我怀疑我们可以绑定到仅使用setsockopt
(不提及IP地址)的接口。
你能做到这一点的唯一方法是你提到 -
通过设置使用
serv_addr.sin_addr.s_addr
你不能做到这一点的特定的IP地址不知道绑定到地址。
如果您需要,您可以使用ioctl
来确定当前的IP地址,但最近可能有一个更聪明的方法来做到这一点 - 我在最近的Linux发行版中没有做太多的工作。
您可以通过设置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 ...
}
警告:你必须要根和有才能使用此选项CAP_NET_RAW
能力。
第二种方法是,您可以使用getifaddrs()解析绑定到接口的IP地址。
请按照后面的链接查看全面的示例。
Thnks乔。我可以通过SO_BINDTODEVICE知道setsockopt的用法吗? – user2003595