c++ - QTcpSocket : selecting source interface using bind() for connection to remote host with connectToHost(): need a workaround

标签 c++ qt sockets interface bind

我想使用特定的源接口(interface)连接到远程主机。我有 3 个接口(interface):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 调用:

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

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

最佳答案

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

当您尝试连接到远程服务器时,您需要提供其 IP 地址。在内部,您的操作系统将根据其路由表选择合适的出接口(interface)来发送这些连接数据包。 (冲突和默认路由这里就不多说了,google一下应该够你文化了)

因此,您只需将 QTcpSocket 用作客户端套接字,connectToHost 并让解析魔法发生。套接字绑定(bind)仅在服务器应用程序中有意义。

关于c++ - QTcpSocket : selecting source interface using bind() for connection to remote host with connectToHost(): need a workaround,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26272645/

相关文章:

c - 为什么将整个 `hints` 变量设置为 0?

c++ - 在 .h 文件与 .cpp 文件中实现内联函数

c++ - C 和 C++ 中 '.' 和 '->' 运算符的正式名称是什么?

c++ - Eigen:将实数和虚数 MatrixXd 映射到 MatrixXcd

c++ - 在 Qt 中解析 XML 文件

java - 自定义 Java Socket 类

阻塞的 python 程序占用 6% 的 CPU?

c++ - 标量对象 '***' 在初始值设定项中需要一个元素

python - 在Python交互模式下使用Pyside安全吗?

c++ - 所有 Qt Quick 按钮控件状态的自定义样式