对于一些特定的网络测试,我创建了一个 VLAN 设备 eth1.900 和几个别名 eth1.900:1 和 eth1.900.2。
eth1.900 Link encap:Ethernet HWaddr 00:18:E7:17:2F:13
inet addr:1.0.1.120 Bcast:1.0.1.255 Mask:255.255.255.0
eth1.900:1 Link encap:Ethernet HWaddr 00:18:E7:17:2F:13
inet addr:1.0.1.200 Bcast:1.0.1.255 Mask:255.255.255.0
eth1.900:2 Link encap:Ethernet HWaddr 00:18:E7:17:2F:13
inet addr:1.0.1.201 Bcast:1.0.1.255 Mask:255.255.255.0
连接到服务器时,有没有办法指定将使用这些别名中的哪一个?我可以使用 -I 地址选项 ping 来选择要使用的别名,但我看不到如何在代码中使用 TCP 套接字而不使用原始套接字来执行此操作,因为我也想在没有额外套接字的情况下运行特权,即如果可能的话,不以 root 身份运行。
不幸的是,即使使用 root,SO_BINDTODEVICE 也不起作用,因为别名设备名称无法识别:
printf("Bind to %s\n", devname);
if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, (char*)devname, sizeof(devname)) != 0)
{
perror("SO_BINDTODEVICE");
return 1;
}
Output:
Bind to eth1.900:1
SO_BINDTODEVICE: No such device
使用 getifaddrs() 枚举所有接口并查找要绑定的接口的 IP 地址。然后在调用 connect() 之前,使用 bind() 绑定到该 IP 地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)