【问题标题】:Qt 5.5 not binding to portQt 5.5 未绑定到端口
【发布时间】: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);

但这并没有帮助。

发送方套接字的本地端口似乎没问题,我看到过像 383495859737433 这样的值。

有谁知道为什么这可能会失败,或者 Qt 是否在某处提供了更多关于它失败的原因信息,或者是否有更好的方法来做到这一点(不会失败)?

【问题讨论】:

  • 您是否以普通用户身份运行它?也许试试root

标签: linux qt udp bind


【解决方案1】:

您可以通过访问m_recvSocket-&gt;errorString() 从套接字获取更多信息。在您的情况下,将cout 行修改为:

std::cout << x
    << " " << m_sendSocket->localPort()
    << " " << m_recvSocket->errorString().toStdString()
    << std::endl;

您将看到类似于“地址已在使用中”的内容,因为正如您所知,Windows 和 Linux 具有不同的默认绑定模式 - 前者是一个共享性更强的操作系统,而后者似乎是报复性的,并且所有格 (a).

所以发送套接字在调用connectToHost()时有效地锁定了它使用的本地端口,这意味着接收套接字无法绑定到它。

解决这个问题的方法是在连接到主机之前让发送套接字显式绑定共享选项。这可以通过以下方式完成:

m_sendSocket = new QUdpSocket(this);
m_recvSocket = new QUdpSocket(this);
m_sendSocket->bind(0, QAbstractSocket::ShareAddress);
m_sendSocket->connectToHost(QHostAddress(host), 43837);
bool x = m_recvSocket->bind(m_sendSocket->localPort(), QAbstractSocket::ShareAddress);
std::cout << x
    << " " << m_sendSocket->localPort()
    << " " << m_recvSocket->errorString().toStdString()
    << std::endl;

这导致输出:

1 47334 Unknown error

在我的系统上,可以忽略错误文本,因为bind 的返回值为真(输出行上的初始1)。


(a) Pax 鸭子作为掩护 :-)

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多