【发布时间】:2013-10-21 13:07:17
【问题描述】:
我运行 Ubuntu 12.04,我目前正在编写 C++ 代码来创建一个 UDP 套接字,它使用 sendto 将数据包发送到各个目的地。现在碰巧我的笔记本电脑同时具有 wlan0 和 eth0 接口。如果我将它绑定到其中任何一个,使用 IP 地址和 SO_BINDTODEVICE 选项,根据目标地址,sendto 仍会决定使用适合他的另一个接口。
具体来说,如果我将一个 UDP 套接字绑定到 eth0 接口,带有它的 ip 地址和一些端口,然后我将一个数据包发送到另一台笔记本电脑(本地,只有 wifi 访问),它将决定使用我的 wlan0 接口。
我知道这种行为有其优点,但我希望能够将其关闭,即我希望能够对套接字说它应该只使用我分配给它的一个接口。
建议?
编辑:
struct sockaddr_storage sa = address;
fd = socket(address.get_family(), SOCK_DGRAM, 0);
char *devname = "wlan0";
setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, devname, strlen(devname));
bind(fd, (sockaddr*)&sa, len);
【问题讨论】:
-
“如果我将它绑定到其中任何一个,使用 IP 地址和 SO_BINDTODEVICE 选项”我一直认为 SO_BINDTODEVICE 获得了一个接口名称(至少这就是我将它用于多播的方式,并且它工作正常)
-
您使用
bind()和接口的地址,这不起作用? (我假设他们有不同的地址) -
@Hasturkun:他们有不同的地址