0
我有一個網絡應用程序,它使用UDP廣播進行設備發現,但一次只接受一個連接。因此,當建立新的TCP連接時,我刪除用於發現的QUdpSocket。使用新的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上的默認設置。
謝謝, Stephen。
我剛剛注意到了一些東西。上面引用的代碼位於Qt「插槽」中。當遠程主機斷開連接時,插槽會快速連續調用兩次。第一次看起來UdpSocket的設置是正確的,所以第二次它使用相同的指針創建另一個新的QUdpSocket並發現它不能綁定這個 - 這並不奇怪。 – 2011-01-14 16:17:47