2

Qt 4.8 文档包含以下建议:

如果要使用标准 QIODevice 函数 read()、readLine()、write() 等,必须首先通过调用 connectToHost() 将套接字直接连接到对等方。

所以我尝试了以下代码:

udp.connectToHost(hostName, hostPort);   // connected
udp.bind(hostName, hostPort);

当我执行此代码时,Qt 会记录以下调试消息:

在 QAbstractSocket::UnconnectedState 中未调用 QNativeSocketEngine::bind()

这意味着bind要求套接字处于未连接状态。所以我尝试了以下方法:

udp.bind(hostName, hostPort);  // bound
udp.connectToHost(hostName, hostPort);

但它也不起作用:套接字没有连接到主机,它处于错误状态。

配置 QUdpSocket 以将其用作 QIODevice 的正确方法是什么?

4

1 回答 1

4

首先将套接字绑定到特定的本地地址/端口然后将套接字连接到特定的外部地址/端口的方法应该可以工作。所以第二个代码示例是正确的。

udp.bind(hostName, hostPort);  // bound
udp.connectToHost(hostName, hostPort);

但这在 Qt 中对于 < 5.5.0 的版本不起作用,因为在内部使用的函数connectToHost总是首先取消绑定套接字并将其再次绑定到任何地址的空闲本地端口。

有关详细信息,请参阅QTBUG-26538 - QUdpSocket:connectToHost() 重置由 bind() 指定的本地端口号

如果重要的是 UDP 套接字在“连接”时绑定到特定的本地地址/端口(UDP 是无连接的)到特定的外部名称/端口以使用重新实现的QIODevice方法,我无法为此 Qt 提供其他解决方法Qt 版本 < 5.5.0 的错误,而不是使用已应用补丁的代码(可以在Qt 5.5 提交消息 102610页面上看到)修补(非常小心地)使用的 Qt 版本的源。

于 2015-03-13T15:28:36.717 回答