QTCPSocket-当主机连接到单独的网络时,如何强制连接到特定网络

QTCPSocket-当主机连接到单独的网络时,如何强制连接到特定网络,qt,qt5,Qt,Qt5,目前,我们的工具使用qtcsocket->ConnectToHost连接到我们的TCP服务器,它可以正常工作 当我们的一些机器跨两个完全不同的IP范围(10.x.x.x、172.x.x.x)桥接两个网络时,就会出现问题。当您尝试连接到172.x.x.x网络上的设备时,它似乎正在尝试通过10.x网络接口连接,然后超时并无法连接。在windows上,如果禁用10.x网络的网络端口并重新加载该工具,它将正确使用172.x网络接口并进行连接。我看不出QTCPSocket有什么办法强迫它使用特定的接口进行

目前,我们的工具使用
qtcsocket->ConnectToHost
连接到我们的TCP服务器,它可以正常工作

当我们的一些机器跨两个完全不同的IP范围(10.x.x.x、172.x.x.x)桥接两个网络时,就会出现问题。当您尝试连接到172.x.x.x网络上的设备时,它似乎正在尝试通过10.x网络接口连接,然后超时并无法连接。在windows上,如果禁用10.x网络的网络端口并重新加载该工具,它将正确使用172.x网络接口并进行连接。我看不出QTCPSocket有什么办法强迫它使用特定的接口进行连接,或者我遗漏了什么?似乎10.x网络以某种方式获得了优先权,我们在尝试建立传出连接时总是尝试使用这种优先权,这不是我们想要的

理想情况下,用户可以选择他们想要用来建立连接的网络接口,无论是10.x还是172.x网络


这是使用Qt5.15.0

您可以先使用接口地址调用
bind()
来选择要使用的传出接口。这将选择要使用的传出地址

见:

对于TCP套接字,此函数可用于指定用于传出连接的接口,这在多个网络接口的情况下非常有用

我为您准备了一个非常简单的演示:

它全部在本地运行。这是服务器main.cpp:

#include <QCoreApplication>
#include <QTcpServer>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTcpServer serv;

    QObject::connect(&serv, &QTcpServer::newConnection, [](){
       qDebug() << "New connection!";
    });
    qDebug() << serv.listen(QHostAddress("192.168.x.y"), 1337);

    return a.exec();
}
#include <QCoreApplication>
#include <QDebug>
#include <QTcpSocket>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTcpSocket s;
    qDebug() << s.bind(QHostAddress("127.0.0.1"));
    s.connectToHost(QHostAddress("192.168.x.y"), 1337);


    return a.exec();
}
因此:

qDebug() << s.bind(QHostAddress("192.168.x.y"));

qDebug()这很有效,谢谢,其他人需要注意的是,QNetworkInterface::allAddresses()为您提供了所有具有链接的IPV4和IPV6接口,而无需迭代AllInterface()提供的每个接口来查找该信息。
qDebug() << s.bind(QHostAddress("192.168.x.y"));