2012-09-06 71 views
0

我正在嘗試使用UDP發送數據包。我知道,如果頻道不空閒,數據包將不會被髮送。我正在使用QT的udpSocket->writeDatagram發送UDP數據包。我正在做一個循環,我想確保在發送前一個數據包之前不發送另一個數據包。有沒有一個標誌,或任何其他方式,我可以檢查,並確保數據包發送?如何檢查UDP數據包是否在發送器上發送

回答

3

docs說:

數據大小大小到主機地址地址發送數據報在 端口端口。返回成功發送的字節數;否則 返回-1。

所以,如果它返回-1以外的東西,你可以認爲它是「發送」。然而,如果你真正想知道的是它是否讓它在另一邊,你會希望聽到同行的聲音。

+0

非常感謝,我在QT文檔中忽略了這個解釋。 – TJ1

4

UDP是一種不可靠的設計協議。它不能保證數據包不會丟失,當它們丟失時,發件人不會被通知。所以你永遠不知道對方是否成功接收到UDP數據包。

當然,除非您的應用程序級協議發送特定的響應。但是,迴應可能會很容易丟失,所以沒有任何迴應沒有明確證明數據包沒有收到。

3

通常,爲了儘可能快地發送UDP數據包(但不能更快),您需要將套接字置於非阻塞模式,然後以循環方式發送數據包,直到send()/ sendto()返回-1/EAGAIN(又名EWOULDBLOCK)。當返回結果代碼時,跳出發送循環循環並等待套接字再次變爲可寫。在Qt下,你可以設置一個QSocketNotifier對象(一次,在你設置你的套接字之後),並且只要你的套接字有更多外出數據的空間,它就會發出一個激活的(int)信號。當您收到該信號時,您可以發送更多的數據包。

+1

是的,該策略可能會精確地使發件人的網絡接口飽和。但它也可能壓倒接收機的接口或任何中間網絡。 –

+0

感謝你的回答,這很有用。 – TJ1