gpt4 book ai didi

c++ - 如何停止行为 : C++ Socket sendto changes interface

转载 作者:太空宇宙 更新时间:2023-11-04 11:47:05 25 4
gpt4 key购买 nike

我运行 Ubuntu 12.04,我目前正在编写 C++ 代码来创建 UDP 套接字,它使用 sendto 将数据包发送到各个目的地。现在碰巧我的笔记本电脑同时具有 wlan0eth0 接口(interface)。如果我将它绑定(bind)到其中一个,使用 IP 地址和 SO_BINDTODEVICE 选项,根据目标地址,sendto 仍然会决定使用适合他的另一个接口(interface)。

具体来说,如果我将一个 UDP 套接字绑定(bind)到 eth0 接口(interface),带有它的 IP 地址和一些端口,然后我将一个数据包发送到另一台笔记本电脑(本地,只有 wifi 访问),它将决定使用我的 wlan0 接口(interface)。

我知道这种行为有优点,但我希望能够将其关闭,即我希望能够告诉套接字它应该只使用我分配给它的一个接口(interface)。

建议?

编辑:

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);

最佳答案

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

但是绑定(bind)一个socket到一个interface并不会影响正常的IP路由过程。当您发送数据包时,网络 IP 堆栈负责找到最佳路由并通过硬件适配器发送 IP 数据包。这可以是一个以太网适配器,但它不是具有绑定(bind)操作的 Controller 。

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

关于c++ - 如何停止行为 : C++ Socket sendto changes interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19495414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com