2012-05-24 71 views
2

我使用的是TCP庫稱爲拉塞寧http://lacewing-project.org/TCP庫是捆綁消息?

服務器和客戶端類我注意到,當我送一個客戶端幾個獨立的消息,有時它們捆綁,我可以把它們分開的唯一途徑就是通過解析他們再次。發送二進制數據時,很難解析。

有誰知道爲什麼它可能做到這一點?我在客戶端和服務器上都嘗試了DisableNagling(),但它仍然可以。

下面是一些例子,我可能送:

void ServerCore::loginRequestC(const std::string& userName, const std::string& password) 
{ 
    std::cout << "Got request" << std::endl; 
    ServerPlayer* player = (ServerPlayer*)getServerClient()->Tag; 
    player->setUsername(userName); 

    for (size_t i = 0; i < m_players.size(); ++i) 
    { 
     if(m_players[i] != player) 
     { 
      std::cout << "Telling new about " << m_players[i]->getUsername() << std::endl; 
      m_enc.playerJoinedS(m_players[i]->getUsername()); 
      player->getClient()->Send(m_enc.getLastMessage().c_str()); 
     } 
    } 

    m_enc.loginResultS(true,""); 

    player->getClient()->Send(m_enc.getLastMessage().c_str()); 

    m_enc.playerJoinedS(userName); 
    for (size_t i = 0; i < m_players.size(); ++i) 
    { 
     if(m_players[i] != player) 
     m_players[i]->getClient()->Send(m_enc.getLastMessage().c_str()); 
    } 

} 

所以,如果我打算有:

MSG_A 
MSG_B 
MSG_C 

它可能會發送:

MSG_A 
MSG_BMSG_C 

的消息得到隨機捆綁在一起。這不是我的代碼,這是問題。我檢查過。

雖然捆綁消息非常有用,我想,當它發生,而不是庫來控制。

謝謝

回答

7

這不是圖書館,但TCP協議本身是做什麼的。 TCP套接字是一個雙向字節流。一次寫入可能會在另一側產生多次讀取,反之亦然。

你有你設計應用層協議,這樣很容易給流拆分成消息。常用的方法是使用長度前綴或消息分隔符。

+0

我會永遠只能得到一個消息的一部分,例如MS那麼接下來將G_B – jmasterx

+1

是的,你需要在一個循環讀取字節,直到你有足夠的字節來揣摩出的信息是什麼/。 –

2

TCP是面向流的協議,因此它沒有內置的消息邊界。您需要自行將流分成消息。

UDP在相反是數據報協議,並且每個數據包都有一個單獨的消息。缺點是它不可靠。