2014-05-02 39 views
1

嗨,我有一個使用C#套接字服務器和C++套接字客戶端的套接字編程。C++ socket讀端讀取連接的所有消息

服務器我用Socket.Send(bytes[])發送消息

CPP客戶端我使用recv(socket,buffer,length,flags) 但在服務器,如果我在客戶端上我收到的所有消息作爲級聯同時發送多條消息。

for(int i=0;i<10;i++) 
{ 
var bytes= GetBytes("msg"+i); 
theSocket.Send(bytes); 
} 

C++套接字客戶端:

Thread.Start() 
{ 
    var msg = recv(theSocketClient,buffer,1024,0); 
    ProcessMessageFromSocket(msg); 
} 

預期是: 過程MSG1然後 過程MSG2 ...過程MSG10 實際: 而processMessage(msg1msg2msg3 ... MSG10);

我失蹤了? 我試圖解決這個問題: 1. C#NetworkStream.Flush() - 即使在這之後,它給了我連接的字符串 2.CPP每次讀完後擦除緩衝區(但實際套接字有數據連接,沒有幫助)

+0

你必須記住,TCP是一個流媒體協議,沒有開始或結束的流,數據只是流動。如果你需要分離消息,你必須自己做。 –

+0

例如,IRC使用'\ r \ n'(回車,然後換行)來分隔消息。 – Mgetz

回答

1

簡單 - TCP無法傳輸超過一個字節的任何消息 - 它是一個八位字節/字節流。

如果您想傳輸長度超過一個字節的消息,則需要TCP上的另一個協議。

+1

..是的,我知道這是一個多重複制,但比找到二人組更容易回答。 –

+1

我寧願殺掉所有這些問題,並將它們指向TCP常見問題解答。我可以告訴OP沒有使用recv的返回值,儘管他沒有發佈相關的代碼!這不是令人沮喪嗎?!總是一樣的錯誤。我可以創建一個腳本,向所有新的TCP問題發佈相同的消息,並且50%的時間是正確的。 – usr

2

以這種方式工作是正常的。您可以自行定義分割數據的協議,例如,您可以選擇以4個字節開始傳輸,告訴您傳輸的時間。