QTcpSocket:使用bind()选择源接口,通过connectToHost()连接到远程主机:需要一个解决方法

时间:2014-10-09 07:27:35

标签: c++ qt sockets interface bind

我想使用某些源接口连接到远程主机。我有 3个接口:eth0(192.168.230.100),wlan0(10.0.9.100)和lo:

假设mSocket是类成员:

QTcpSocket mSocket;

在构造函数中我们使用:

bool ret = mSocket.bind(QHostAddress("10.0.9.100"));

然后在计时器中我们尝试连接:

void CamComponent::tryToConnect()
{    
    mSocket.connectToHost(QHostAddress(CameraIpAddr), CameraPort);
}

在此之后我使用TCPDUMP来查看传出的数据包,并且它们没有源IP 10.0.9.100。使用strace我已经检查过Qt打电话给:

  • socket()
  • bind()
  • socket()< - 这会导致问题,它是QT内部的 问题
  • 连接()

此问题的解决方法是什么?

1 个答案:

答案 0 :(得分:1)

这个问题与Qt无关。您只需要了解一下TCP / IP堆栈的工作原理。

当您尝试连接到远程服务器时,您提供其IP地址。在内部,您的操作系统将根据其路由表选择适当的输出接口来发送这些连接数据包。 (我不会在这里谈论冲突和默认路由,谷歌应该足以让你的文化发挥作用)

所以,你只需要使用你的QTcpSocket作为客户端套接字,connectToHost并让分辨率魔术发生。套接字绑定仅在服务器应用程序中有意义。