问题背景:
在我们的机器上,有多个网络接口连接到不同的网络。存在可能重叠的IP地址(例如,两台不同的机器在两个不同的网络中具有相同的IP地址)。因此,当我们想要连接特定对等方时,我们需要指定它的IP地址以及我们的网络接口,以便正确地连接到该网络。 我们希望编写一个能够通过TCP与特定对等方建立连接的C/C++应用程序。
问题:
我正在尝试使用已设置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字段)被使用。因此,我只能传递接口的名称。
- 如果强制接口与路由表中的接口相同,则一切正常。
- 如果强制接口不同,则(使用Wireshark测试):
- SYN从强制接口发送到所需的对等方。
- 在强制接口上收到所需对等方的SYN,ACK。
- 未从强制接口发送ACK,因此未建立连接。(并返回步骤2。)
如何检查我们的系统拒绝了SYN、ACK或ACK的位置?以及如何正确地强制TCP套接字使用特定接口进行连接(与路由表相反)?
也许还有其他更方便的方法来在所需的接口上创建TCP连接吗?
谢谢!