c++ - TCP 库正在捆绑消息?

标签 c++ api tcp

我正在使用一个带有名为 Lacewing 的服务器和客户端类的 TCP 库 http://lacewing-project.org/

我注意到,当我向客户端发送多个单独的消息时,它有时会将它们捆绑在一起,而我可以将它们分开的唯一方法是再次解析它们。发送二进制数据时,虽然很难解析。

有谁知道它为什么会这样做?我在客户端和服务器上都尝试了 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

消息随机捆绑在一起。问题不是我的代码。我检查过了。

虽然捆绑消息很有用,但我想控制它何时发生,而不是库。

谢谢

最佳答案

这不是库,而是 TCP 协议(protocol)本身在做这件事。 TCP 套接字是双向字节流。一次写入可能导致另一侧多次读取,反之亦然。

您必须设计应用程序级协议(protocol),以便轻松将该流拆分为消息。常见的方法是使用长度前缀或消息定界符。

关于c++ - TCP 库正在捆绑消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10744076/

相关文章:

c# - 需要专家对 .net 应用程序最快通信的评论

通过 HTTP 代理的 Java TCP 数据包

c++ - 我可以在不增加类内存的情况下为派生类中的基类成员起别名吗?

c++ - gnuplot 输出生成 png C++ Xcode

c++ - c4930 可能的编译器错误

php - 我的PHP获取YouTube视频API函数未打印任何内容

api - angular2 中的同步 GET 请求

自定义类构造函数中的 C++ 指针赋值

javascript - 每次使用 Express 和 Node.js 的 RestFul API 都会崩溃,如何解决这个问题?

c - 通过 C 中的 TCP 套接字传输后的字符串比较