将QUdpSocket用作QIODevice的正确方法是什么?

时间:2012-12-19 04:45:26

标签: c++ qt sockets udp

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的正确方法是什么?

1 个答案:

答案 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的页面上看到。