Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost asio在基于tcp的协议中查找消息的开头_C++_Sockets_Boost_Protocols_Boost Asio - Fatal编程技术网

C++ boost asio在基于tcp的协议中查找消息的开头

C++ boost asio在基于tcp的协议中查找消息的开头,c++,sockets,boost,protocols,boost-asio,C++,Sockets,Boost,Protocols,Boost Asio,我想为通过tcp发送数据并使用以下协议的传感器实现一个客户端: 消息头以uint32 标头的总长度为24字节(包括起始序列),包含消息正文的字节大小,如uint32 消息正文直接发送到消息头之后,而不是由demimiter终止 目前,我得到了以下代码(假设存在连接的套接字) typedef无符号字符字节; boost::system::error\u code error; boost::asio::streambuf buf; string magic_word_s={static_cast(

我想为通过tcp发送数据并使用以下协议的传感器实现一个客户端:

  • 消息头以
    uint32
  • 标头的总长度为24字节(包括起始序列),包含消息正文的字节大小,如
    uint32
  • 消息正文直接发送到消息头之后,而不是由demimiter终止
  • 目前,我得到了以下代码(假设存在连接的套接字)

    typedef无符号字符字节;
    boost::system::error\u code error;
    boost::asio::streambuf buf;
    string magic_word_s={static_cast(0xAF),static_cast(0xFE),
    静态_-cast(0xC0),静态_-cast(0xC2)};
    ssize\u t n=boost::asio::read\u until(socket、buf、magic\u word、error);
    如果(错误)
    
    标准::cerr。。。就像上面说的。。。您只需将其“保留”在对象中,或将其临时存储在另一个对象中,并处理完整的消息(下面称为“数据包”)

    我在我的一个项目中采用了类似的方法。我将解释一下我是如何做到的,这将使您大致了解如何正确处理数据包

    在我的读取处理程序(-callback)中,我不断检查数据包是否完整。元数据信息(您的标题)临时存储在与远程伙伴(map)关联的映射中

    例如,它可以如下所示:

    4 byte identifier
    4 byte message-length
    n byte message
    
    处理传入数据,检查是否已接收到标识符+消息长度,继续检查消息数据是否与接收到的数据一起完成。
    将数据包的其余部分保留在临时缓冲区中,擦除旧数据。
    下一个数据包到达时继续处理,或检查接收到的数据是否已完成下一个数据包

    这种方法听起来可能有点慢,但在速度较慢的机器上,我甚至可以使用SSL 10MB/s+。
    如果没有SSL,则可以实现更高的传输速率

    通过这种方法,您还可以查看或了解其版本

    4 byte identifier
    4 byte message-length
    n byte message