2011-09-06 185 views
0

我可以通過UdpClient.Send(字節數組)或UdpClient.Client.Send(stream)方法在整個udp協議中發送數據。兩種方法都有效。唯一的區別是在一個方法中,我傳遞一個字節數組,另一個傳遞一個流。UdpClient.Send方法和UdpClient.Client.Send方法之間的區別

簡單的例子:

UdpClient udpClient = new UdpClient(localEndPoint); 
// I can eather send data as: 
udpClient.Send(new byte[] { 0, 1, 2 }, 3); 
udpClient.Client.Send(new byte[5]); 

而且該方法將保證我的數據到達它的目的地,沒有信息丟失?我已經讀過udp協議不能確保所有字節到達它的目的地,因此對於流式視頻,音頻更好,而不是像我正在做的那樣傳輸文件。我使用udp而不是tcp的原因是因爲在恰好位於路由器後面的兩個用戶之間建立tcp連接非常複雜。我知道如果其中一個用戶在他的路由器上啓用端口轉發,這將是可能的。我設法通過做所謂的udp punch holing來發送數據。 udp punch holing使您能夠藉助服務器在路由器後面的兩個用戶之間建立連接。如果你在谷歌這裏能夠找到很多信息,那麼解釋在這裏的工作將會很長。反正我只是想讓你知道我爲什麼用udp代替tcp。我現在不能用這個協議發送文件,確保沒有數據丟失。也許我必須創建一個算法。或者UdpClient.Client.Send方法可以確保數據將被接收,並且UdpClient.Send方法不能確保數據將被接收。

回答

1

UDP不保證數據傳輸或它們的順序。它只保證您是否成功接收數據包,數據包完整。您需要通過自己的實施使您的網絡通信可靠。這兩個功能不應該有任何區別。

UNIX Network Programming有關於此主題的章節。 (22.5爲UDP應用程序添加可靠性)。你也可以看看libginble它支持NAT穿越功能(STUN或中繼)和通信的可靠性。

這篇文章,Reliability and Flow Control,也可能幫助您瞭解實現它的一種可能的方法。祝你好運!

1

這兩種方法之間沒有區別,UdpClient是一個套接字的包裝。 UdpClient.Client只是讓你直接訪問UdpClient使用的Socket。它們最終都通過套接字發送數據。

既不保證所有的數據都會被接收。 UDP不保證1.數據將被交付,2.如果它被交付,它將按順序交付。如果你需要這兩者(並且不能使用TCP),你必須自己編寫這些代碼。

您可以使用的最簡單的協議是爲每個數據包添加一個序列。讓服務器發送一個數據包並等待客戶端收到它的響應,然後發送下一個數據包。該順序非常重要,因爲如果客戶端對服務器的響應丟失,則客戶端可能會從服務器接收兩次相同的數據包。

您的序列號可以是文件大小的當前位置(以字節爲單位) - 這就是TCP使用的位置。

我建議閱讀TCP協議,以便了解它用於處理可靠性的機制(請記住TCP和UDP都建立在IP上 - TCP只是一種更強大的(和coplex)協議,因此您可以實施它自己的部分)

+0

我希望我可以使用tcp。我無法在nat後面的兩個用戶之間建立tcp連接。通過在服務器的幫助下完成udp打孔操作,我已經能夠通過udp完成這項工作。也許我可以用ftp等其他協議來打孔。我的意思是,我想用udp來做這件事的原因是它是唯一的協議,它使我能夠在nat後面連接兩個對等端,而無需在路由器上啓用端口轉發 –

相關問題