我使用的是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
的消息得到隨機捆綁在一起。這不是我的代碼,這是問題。我檢查過。
雖然捆綁消息非常有用,我想,當它發生,而不是庫來控制。
謝謝
我會永遠只能得到一個消息的一部分,例如MS那麼接下來將G_B – jmasterx
是的,你需要在一個循環讀取字節,直到你有足夠的字節來揣摩出的信息是什麼/。 –