2011-04-26 46 views
0

我正在使用C++編寫TCP客戶端服務器應用程序,第三方lib現在允許在這個項目中使用。recv socket api的內部工作

這裏的客戶端服務器之間交換使用需要以及format.once客戶端接收數據包定義協議,它將發送它parsing.I具有將於解析活動的護理方案經理。

當數據從網絡到達客戶端我有以下疑問
, 直到應用程序調用的recv()函數的OS對其進行緩衝。

所以兩個消息MSG1和MSG2到達緩衝區的recv的調用將返回MSG 1 + MSG2。 現在這可能導致解析活動失敗。

我的查詢
1.上述假設是否正確?
2.如果上面提到的假設是正確的,那麼如何解決這個問題。

+1

看看[這](http://stackoverflow.com/questions/4896411/tcp-client-message-handling)的問題,它談論如何,你應該從服務器處理通過TCP消息。 – cpx 2011-04-26 09:49:12

+0

謝謝cpx我認爲它應該可以工作 – 2011-04-26 10:17:47

+0

你是對的:'recv'可能會全部返回這兩個消息。在其他情況下,'recv'可能只返回部分消息,或者可能返回msg1和msg2的全部。簡而言之,'recv'不知道和不尊重產生數據流的'send'調用的順序。 TCP將保證的是:它所返回的所有字節將按順序排列,沒有任何跳過。 (N.b.其他規則適用於UDP或其他協議。) – 2011-04-26 22:42:30

回答

0

TCP模擬一個流,所以在TCP沒有消息的概念。如果你想要消息,你的應用程序必須有一些協議來分離它們。

UDP確實有一個信息,所以它可以檢索單獨的消息。

+0

Sjoerd我同意你的意見。可以給我一些例子或案例......以便我可以從此開始。 – 2011-04-26 09:38:20

+0

會偷看標題和獲取消息大小,然後讀取其餘的字節在這裏將是適當的? – 2011-04-26 09:39:42

0

您可以使用一個LV協議(長度值)爲您的消息。 在第一個(1-4)字節中編碼消息長度,然後放入消息。 例如:14「Hello world \ 0」

在您的服務器中,當客戶端發送某些東西時,您必須recv()第一個(1-4)字節,然後recv()的消息。