gpt4 book ai didi

c++ - 如何使 TCP 套接字与 SO_BINDTODEVICE 一起工作(针对路由表)

转载 作者:可可西里 更新时间:2023-11-01 02:34:34 28 4
gpt4 key购买 nike

问题背景:

在我们的机器上,我们有多个网络接口(interface)导致不同的网络。可能存在重叠的 IP 地址(例如,两个不同网络中的两台不同机器具有相同的 IP 地址)。因此,当我们想要与特定的对等点连接时,我们不仅需要指定它的 IP 地址,还需要指定通向正确网络的网络接口(interface)。我们想用 C/C++ 编写能够通过 TCP 与特定对等点连接的应用程序。

问题:

我正在尝试使用设置了 SO_BINDTODEVICE 的套接字建立 TCP 连接。这是一个简化的片段:

sockfd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, interface_name,
strlen(interface_name));
connect(sockfd, (sockaddr *) &serv_addr, sizeof(serv_addr));

(我知道 struct ifreq,但似乎只有其中的第一个字段(ifr_name 字段正在使用中)。所以我只能传递接口(interface)的名称。)

  • 如果强制接口(interface)与路由表中的接口(interface)相同,则一切正常。
  • 如果强制接口(interface)不同,则(使用 Wireshark 测试):
    1. SYN 从强制接口(interface)发送到所需的对等点。
    2. 在强制接口(interface)上收到来自所需对等方的 SYN、ACK。
    3. ACK 未从强制接口(interface)发送,连接未建立。 (然后转到第 2 步。)

如何查看我们的系统在何处拒绝了 SYN、ACK 或 ACK?以及如何正确地强制 TCP 套接字使用特定接口(interface)(针对路由表)建立连接?

也许还有其他一些更方便的方法可以在所需接口(interface)上创建 TCP 连接?

谢谢!

最佳答案

我知道这不是你的答案,但你可以禁用其他接口(interface)并只启用你想要的网络,在你的情况下似乎你需要所有接口(interface),但我认为这种方法可以帮助其他人。你可以用这样的东西启用/禁用网络接口(interface):

启用

ifr.ifr_flags = true; 
strcpy(ifr.ifr_name, "eth0"); //you could put any interface name beside "eth0"
res = ioctl(sockfd, SIOCSIFFLAGS, &ifr);

对于禁用,您只需将标志设置为 false,其余代码相同:

ifr.ifr_flags = true;

关于c++ - 如何使 TCP 套接字与 SO_BINDTODEVICE 一起工作(针对路由表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12603096/

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