繁体   English   中英

c ++ boost :: asio :: buffer和结构

[英]c++ boost::asio::buffer and structures

无论如何基本上做以下事情:

#include <boost/asio.hpp>

struct testStruct{
    int x;
    int y;
};

int main(){
    struct testStruct t;
    boost::asio::buffer b;
    b = boost::asio::buffer(t); 
    return 0;
}

似乎失败的地方是将't'传递到缓冲区'b'。

使用多个缓冲区的分散操作:

#include <boost/asio.hpp>

#include <vector>

struct testStruct{
    int x;
    int y;
};

int
main()
{
    struct testStruct t;
    t.x = 5;
    t.y = 7;

    std::vector<boost::asio::const_buffer> buffers;
    buffers.push_back( boost::asio::buffer(&t.x, sizeof(t.x) ) );
    buffers.push_back( boost::asio::buffer(&t.y, sizeof(t.y) ) );

    boost::asio::io_service io_service;
    boost::asio::ip::tcp::socket socket( io_service ); // note not connected!
    std::size_t length = boost::asio::write( socket, buffers );

    return 0;
}

请注意,您需要在接收方使用相应的聚集。 除了你提出的人为例子之外,这一点非常繁琐。 这就是为什么我建议 在前一个问题中使用更强大的序列化机制。

只需使用Boost.Serialization您可以从http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/examples.html获取演示

如果要发送对象,最好先将其序列化。

您需要注意一些事项。

1.填充

结构的布局是特定于实现的。 完全有可能在服务器上的结构的x和y成员之间存在占位符字节,而在客户端上没有。

要解决此问题,您应该按成员将结构成员序列化为字符缓冲区,并以相同的方式在客户端上反序列化它们。

您可以编写一些实用程序代码来帮助您完成此操作,这是一个起点:

class packet_writer
{
public:
    template <typename iter> void write(iter begin, iter end)
    {
        buffer_.insert(buffer_.end(), begin, end);
    }

    template <typename T> void write(T data)
    {
            int8_t* begin = reinterpret_cast<int8_t*>(&data);
        write(begin, begin + sizeof(data));
    }

    const std::vector<int8_t>& buffer() const
    {
        return buffer_;
    }

private:
    std::vector<int8_t> buffer_;
};

2.字节序

根据体系结构,或者在某些情况下甚至取决于当前的CPU模式(某些POWER CPU支持字节顺序切换),您的成员的字节可能会相反。 您必须检测主机体系结构的字节顺序,并将字节交换为预定义的顺序,以便在协议中使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM