如何停止行为:C ++ Socket sendto更改界面

时间:2013-10-21 13:07:17

标签: c++ sockets

我运行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);

1 个答案:

答案 0 :(得分:1)

使用SO_BINDTODEVICE或bind将套接字绑定到接口会为接收的数据包定义过滤器。如果未使用指定接口接收到数据包,则不会将其传递给套接字的接收队列。请参阅:http://linux.die.net/man/7/socket

但是将套接字绑定到接口不会影响正常的IP路由过程。发送数据包时,网络IP堆栈负责找到最佳路由并通过硬件适配器发送IP数据包。这可以是以太网adpter,但它不是控制器和绑定操作。

如果要在特定接口发送数据包,则需要原始套接字。您构建完整的数据包内容,包括IP和硬件层(可能是以太网),并使用原始套接字发送它。