簡體   English   中英

UDP發送和接收套接字行為

[英]Udp Send and Receive socket behavior

我正在編寫一個程序,該程序將首先對服務器進行身份驗證,然后通過UDP發送和接收消息。 在發送和接收消息時,我還需要維護與服務器的連接,因此我需要定期將KeepAlive發送到服務器並從服務器接收響應。

我知道可以在同一時間在同一套接字上發送和接收數據包,但是我擔心這種情況:我花了一些時間來構建要發送的數據包,在此期間,服務器向我發送了兩條消息。

  1. 當我調用receive()時,第二條消息是否會覆蓋第一條消息?
  2. 為要完成的任務設置兩個UDP套接字是最佳實踐嗎? 一個用於發送的插槽和一個用於接收的插槽。

謝謝Lex

不幸的是,您說您無法控制的服務器需要UDP 具有身份驗證方案。 這是一個嚴重的安全問題,因為攻擊者相對容易地假裝與已通過身份驗證的客戶端相同的UDP端點。

至於您的具體問題:

  1. 在理想的情況下,如果服務器在嘗試接收任何數據報之前向您發送了兩個數據報(消息),則您仍將按照發送它們的順序接收兩個數據報,因為操作系統已將它們緩沖並提供給為了你。

問題在於,這不是一個完美的世界,尤其是在處理UDP時。 UDP具有三個重要限制:

  • 不保證任何給定數據報的傳送。 任何數據報都可能隨時丟失。
  • 不能保證交貨順序。 數據報不一定按發送時的相同順序接收。
  • 不能保證交付的唯一性。 任何給定的數據報可能會被多次傳遞。

因此,如果服務器發送第二個數據報,不僅有可能會丟失第一個數據報(如果您尚未收到),那么無論如何第一個數據報都可能會丟失。 您不能保證任何數據報都會被交付給您。

現在,也有你與數據報做什么,一旦你已經收到了這個問題。 不幸的是,從您的問題中尚不清楚這是否是您要問的內容的一部分。 但是自然地,一旦對ReceiveFrom()的調用完成(或者,如果您已經在UDP Socket上使用了Connect()Receive()的調用)並且您擁有了數據報,這完全取決於您的代碼如何處理以及是否先前-接收的數據是否被覆蓋。

  1. 創建兩個單獨的UDP Socket實例不是一個最佳實踐,一個實例用於處理接收,另一個實例用於發送。 不僅是沒有必要的,您還必須具有某種機制讓服務器理解兩個不同的遠程端點實際上代表同一客戶端(因為即使保證它們位於相同的IP地址上,它們通常具有不同的端口號) ),否則您將不得不使用“重用地址”選項來濫用Socket (這是一種允許兩個不同的Sockets使用同一端口的方法,但這會導致其他各種問題)。

將相同的Socket實例用於接收和發送都很好,實際上,這就是您期望使用它的方式。 最佳做法是這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM