2011-01-14 738 views
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。

+0

我剛剛注意到了一些東西。上面引用的代碼位於Qt「插槽」中。當遠程主機斷開連接時,插槽會快速連續調用兩次。第一次看起來UdpSocket的設置是正確的,所以第二次它使用相同的指針創建另一個新的QUdpSocket並發現它不能綁定這個 - 這並不奇怪。 – 2011-01-14 16:17:47

回答

1

......換句話說,這個問題已經回答了!