[英]Udp Send and Receive socket behavior
我正在編寫一個程序,該程序將首先對服務器進行身份驗證,然后通過UDP發送和接收消息。 在發送和接收消息時,我還需要維護與服務器的連接,因此我需要定期將KeepAlive發送到服務器並從服務器接收響應。
我知道可以在同一時間在同一套接字上發送和接收數據包,但是我擔心這種情況:我花了一些時間來構建要發送的數據包,在此期間,服務器向我發送了兩條消息。
謝謝Lex
不幸的是,您說您無法控制的服務器需要UDP 並具有身份驗證方案。 這是一個嚴重的安全問題,因為攻擊者相對容易地假裝與已通過身份驗證的客戶端相同的UDP端點。
至於您的具體問題:
問題在於,這不是一個完美的世界,尤其是在處理UDP時。 UDP具有三個重要限制:
因此,如果服務器發送第二個數據報,不僅有可能會丟失第一個數據報(如果您尚未收到),那么無論如何第一個數據報都可能會丟失。 您不能保證任何數據報都會被交付給您。
現在,也有你與數據報做什么,一旦你已經收到了這個問題。 不幸的是,從您的問題中尚不清楚這是否是您要問的內容的一部分。 但是自然地,一旦對ReceiveFrom()
的調用完成(或者,如果您已經在UDP Socket
上使用了Connect()
對Receive()
的調用)並且您擁有了數據報,這完全取決於您的代碼如何處理以及是否先前-接收的數據是否被覆蓋。
Socket
實例不是一個最佳實踐,一個實例用於處理接收,另一個實例用於發送。 不僅是沒有必要的,您還必須具有某種機制讓服務器理解兩個不同的遠程端點實際上代表同一客戶端(因為即使保證它們位於相同的IP地址上,它們通常具有不同的端口號) ),否則您將不得不使用“重用地址”選項來濫用Socket
(這是一種允許兩個不同的Sockets
使用同一端口的方法,但這會導致其他各種問題)。 將相同的Socket
實例用於接收和發送都很好,實際上,這就是您期望使用它的方式。 最佳做法是這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.