Qt 4.8 documentation包含以下建议:
如果要使用标准QIODevice函数read(),readLine(),write()等,必须首先通过调用connectToHost()将套接字直接连接到对等。
所以我尝试了以下代码:
udp.connectToHost(hostName, hostPort); // connected
udp.bind(hostName, hostPort);
当我执行此代码时,Qt会记录以下调试消息:
QAbstractSocketEngine :: bind()未在QAbstractSocket :: UnconnectedState中调用
意味着bind
要求套接字处于未连接状态。所以我尝试了以下内容:
udp.bind(hostName, hostPort); // bound
udp.connectToHost(hostName, hostPort);
但它也不起作用:套接字没有连接到主机,它处于错误状态。
配置QUdpSocket以将其用作QIODevice的正确方法是什么?
答案 0 :(得分:4)
首先将套接字绑定到特定本地地址/端口然后将套接字连接到特定外部地址/端口的方法应该有效。所以第二个代码示例是正确的。
udp.bind(hostName, hostPort); // bound
udp.connectToHost(hostName, hostPort);
但是在Qt版本中这不起作用< 5.5.0因为connectToHost
内部使用的函数总是先解除套接字的绑定,然后再将它绑定到任何地址的空闲本地端口。
有关详细信息,请参阅QTBUG-26538 - QUdpSocket: connectToHost() resets local port number specified by bind()。
如果重要的是UDP套接字绑定到特定的本地地址/端口上“连接”(UDP是无连接的)到特定的外部名称/端口以使用重新实现的QIODevice
方法,我可以'为Qt版本提供此Qt错误没有其他解决方法< 5.5.0使用所应用补丁的代码修补(非常仔细)使用的Qt版本的来源,可以在Qt 5.5 commit message 102610的页面上看到。