【发布时间】:2012-09-18 03:49:57
【问题描述】:
问题背景:
在我们的机器上,我们有多个网络接口,它们通向不同的网络。可能存在重叠的 IP 地址(例如,两个不同网络中的两台不同机器具有相同的 IP 地址)。因此,当我们想与特定的对等方连接时,我们不仅需要指定它的 IP 地址,还需要指定我们的网络接口,它可以连接到正确的网络。 我们想用 C/C++ 编写能够通过 TCP 与特定对等点连接的应用程序。
问题:
我正在尝试使用设置了 SO_BINDTODEVICE 的套接字建立 TCP 连接。这是一个简化的 sn-p:
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字段正在使用)。所以我只能传递接口的名称。)
- 如果强制接口与路由表中的接口相同,则一切正常。
- 如果强制接口不同,则(使用 Wireshark 测试):
- SYN 从强制接口发送到所需的对等体。
- 在强制接口上收到来自所需对等方的 SYN、ACK。
- 未从强制接口发送 ACK 且未建立连接。 (然后转到第 2 步。)
如何检查我们的系统在哪里拒绝 SYN、ACK 或 ACK?以及如何正确强制 TCP 套接字使用特定接口(针对路由表)建立连接?
也许还有其他更方便的方法可以在所需接口上创建 TCP 连接?
谢谢!
【问题讨论】:
标签: c++ c sockets tcp network-programming