我有一个网络应用程序,它使用UDP广播进行设备发现,但一次只接受一个连接。因此,当建立新的TCP连接时,我删除用于发现的QUdpSocket。
但是,当远程设备断开连接时,我想创建一个新的QUdpSocket并再次开始监听:
// Set up a UDP server to respond to any "discovery" messages:
udpServer = new QUdpSocket(this);
if (udpServer -> bind(QHostAddress::Any, DISCOVERY_PORT))
connect(udpServer, SIGNAL(readyRead()),
this, SLOT(beDiscovered()));
else
{
fprintf(stderr, "UDP port not bound successfully: %d, ", udpServer ->error());
fprintf(stderr, udpServer ->errorString().toLocal8Bit());
fprintf(stderr, "\r\n");
fflush(stderr);
#ifdef WIN32
_commit(_fileno(stderr));
#else
fsync(_fileno(stderr));
#endif
}
然而,重新绑定失败,代码为8,“绑定的地址已被使用”。
那么,我如何确保删除'旧'QUdpSocket时,它会完全释放它绑定的地址?
Alternatievly,我应该使用QUdpSocket :: ShareAddress还是QUdpSocket :: ReuseAddressHint绑定?这似乎不对,因为它们都没有真正描述我想要的行为,即我的QUdpSocket在其生命周期内的独占绑定,并且在任何情况下,QUdpSocket :: ShareAddress都应该是Windows上的默认行为。
谢谢, 斯蒂芬。
答案 0 :(得分:1)
......换句话说,问题已经回答了!