对于一些特定的网络测试中,我创建了一个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
当连接到一台服务器,有没有指定这些别名将被使用的方式? 我可以ping使用-I <IP>地址选项来选择要使用的别名,但我不能看到如何使用TCP套接字做到在代码而不使用原始套接字,因为我也想而无需额外的插槽运行特权,即不以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;
}
输出:
Bind to eth1.900:1 SO_BINDTODEVICE: No such device