我在我的應用程序中使用winsock來維護客戶端 - 服務器連接,並使用非阻塞套接字來完成此操作。但有時,當我收到FD_READ
消息時,看起來recv()
不是返回一個,而是兩個數據包。FD_READ:recv()立即返回兩個數據包
我試圖改變數據包的大小,使它們彼此不同,然後將它與數據量recv()
正在返回進行比較。我100%確定我會不時收到兩個數據包。我認爲我的ping功能是被責備的。我的應用程序中有一個線程時常發送ping消息。然後另一方回覆另一條消息。不知道這是否是最好的方式,但無論如何,現在並不重要。
我所知道的確有時候這些消息會「混合」,因此recv()
一次返回「ping請求」和「ping應答」。它是如何發生的? recv()
應該只返回單個呼叫發送的數據量嗎?即使有時客戶端或服務器獲得「ping請求」消息並作出回覆,但在發送其自己的「ping請求」消息時,即使這種不幸的時間可能,也不應該使另一方能夠將一個數據包與另一個數據包相區別並返回每FD_READ
消息一個?
所以如果我使用UDP,我不會得到這個問題? – PookyFan
好吧,我明白了。還有一件事:當我從recv()得到這個雙包數據包時,我是否會收到一個或兩個FD_READ消息?我的意思是 - 當我得到FD_READ並調用recv()將兩個數據包都收到緩衝區時,我的應用程序是否會發送另一個FD_READ消息? – PookyFan
劃傷我先前的評論。使用UDP會比較容易,因爲正如標記中所提到的,它確實符合數據包邊界(一次讀取會生成一個數據包)。這對你來說可能更容易使用,但你仍然需要一種方法來區分數據包(大小可能不總是工作)。 – Anthony