2017-06-28 36 views
0

我有一個客戶端服務器程序。他們與一些角色交流。TCP/IP:通過recv()獲得的消息順序沒有保留緩衝區

ex: 
client --send A-> server 
then 
client <-recv A'-- server 

但是我讓服務器不按順序發回消息。

ex: 
client --A--> --B--> --C--> server 
then 
client <--A'-- <--C'-- <--B'-- server 
what I want: 
client <--A'-- <--B'-- <--C'-- server 

所以我要來處理客戶PROGRAMM情況

我只能想出一個辦法就是保持緩衝記錄從服務器數據和客戶端將檢查B「接收,然後檢查C」收到訂單。

無論如何要做到這一點在客戶端,並避免使用緩衝區?

+1

這隻有在代碼中存在錯誤時纔可能。 TCP保留髮送字節的順序。 – EJP

+0

@EJP沒有bug,我設計的服務器發回的字符不是按順序 – yayaya

+0

真的。一個問題。爲什麼?爲什麼要在一端建立一個故意的錯誤而不知道如何解決另一端? – EJP

回答

0

理想情況下,您應該發送然後等待回覆,當您收到以前的回覆時發送下一個請求。 但顯然你的客戶似乎沒有等待回覆和服務器回覆,無論哪個請求完成處理髮送。

在這種情況下,您需要根據要發送和接收的數據在客戶端和服務器程序中設置一種機制。

你可以決定你的客戶端和服務器將在具有處理數據(頭+數據)格式是這樣的:

length(2 bytes) - length of actual data 
sequence numner(2 bytes) - to be incremented for each request 
Actual data(length number of bytes) 

當你發送的數據保存請求數據,發送過插座後,在掛起等待服務器回覆的請求列表。 以上述格式接收請求的服務器將更新其在「實際數據」部分中的回覆數據,更新頭部中的長度,保持原樣,服務器將發送回覆給客戶端。 客戶端會將回復中的序列號與未決列表中的項目進行匹配,以獲取從服務器收到回覆的請求

+0

爲什麼?數據如何失序? – EJP

+0

我不是說數據不順序,而是服務器接收到請求數據A然後B,它決定回覆B然後A,我知道TCP有機制按順序發送數據,即如果請求數據A具有多個字節,則將按照它們發送的相同順序達到 – Pras

+0

@Pras TCP將保持順序。但是我讓服務器不按順序將字符發回給客戶端。也許我需要檢查客戶端的內容有效性。我只想知道任何函數或API可以處理這個。 thx – yayaya