【发布时间】:2017-10-18 10:59:15
【问题描述】:
我有一些代码在 Windows 下的 Qt 5.9 中运行良好,但在 Linux 下导致 Qt 5.5 出现问题。
它基本上是联系一个回显服务器来检测一个设备是否在网络上,它首先设置一个 UDP 发送器和接收器,然后它发送一个数据包并检查它是否返回。
问题似乎在于绑定接收套接字:
// Create the two sockets.
m_sendSocket = new QUdpSocket(this);
m_recvSocket = new QUdpSocket(this);
// Connect sending socket to other end.
m_sendSocket->connectToHost(QHostAddress(host), 43837);
// Bind receiving socket so it will receive any response.
bool x = m_recvSocket->bind(m_sendSocket->localPort());
std::cout << x << " " << m_sendSocket->localPort() << std::endl;
它创建两个套接字(传出和传入),然后尝试将传出套接字的本地端口绑定到传入套接字的接收端口(因此可以获取响应)。
这在 Windows 环境下运行良好,但 bind 在 Linux 下失败。由于它返回的只是一个布尔值,我不知道 为什么 它失败了。
认为这可能是平台的默认绑定模式,我也尝试明确设置,以便 Linux 匹配 Windows:
bool x = m_recvSocket->bind(m_sendSocket->localPort(), QAbstractSocket::ShareAddress);
但这并没有帮助。
发送方套接字的本地端口似乎没问题,我看到过像 38349、58597 和 37433 这样的值。
有谁知道为什么这可能会失败,或者 Qt 是否在某处提供了更多关于它失败的原因信息,或者是否有更好的方法来做到这一点(不会失败)?
【问题讨论】:
-
您是否以普通用户身份运行它?也许试试
root?