1

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

1 回答 1

1

使用 SO_BINDTODEVICE 或 bind 将套接字绑定到接口定义接收数据包的过滤器。当没有使用指定接口接收到数据包时,它不会传递到套接字的接收队列。见: http: //linux.die.net/man/7/socket

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

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

于 2013-10-21T13:56:21.563 回答