我想使用特定的源接口(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/