C++ c++;boost::asio::缓冲区和结构

C++ c++;boost::asio::缓冲区和结构,c++,boost-asio,C++,Boost Asio,是否有必要基本上做到以下几点: #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; } #包括 结构测试结构{ int x; int-y; }; int main(){ 结

是否有必要基本上做到以下几点:

#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;
}
#包括
结构测试结构{
int x;
int-y;
};
int main(){
结构testStruct;
boost::asio::buffer b;
b=升压::asio::缓冲器(t);
返回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;
}
#包括
#包括
结构测试结构{
int x;
int-y;
};
int
main()
{
结构testStruct;
t、 x=5;
t、 y=7;
向量缓冲器;
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_服务io_服务;
boost::asio::ip::tcp::socket套接字(io_服务);//注意未连接!
std::size\u t length=boost::asio::write(套接字、缓冲区);
返回0;
}

注意,您需要在接收端使用相应的聚集。除了您所介绍的人为示例之外,这将变得非常乏味。这就是为什么在应用程序中使用更健壮的序列化机制。

有几件事需要注意

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_;
};
类数据包\u编写器
{
公众:
模板无效写入(iter开始,iter结束)
{
buffer.insert(buffer.end(),begin,end);
}
模板无效写入(T数据)
{
int8_t*begin=重新解释强制转换(和数据);
写入(begin,begin+sizeof(数据));
}
常量std::vector&buffer()常量
{
返回缓冲区;
}
私人:
向量缓冲区;
};
2。Endianness


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

只需使用Boost.Serialization即可 您可以从


当您想发送对象时,最好先将其序列化。

对!这看起来确实很乏味。。。我只是想了解一下我的选择。谢谢你一直以来的帮助@安德鲁:没问题,很乐意帮忙!遇到问题时不断提问,这就是Stackoverflow的作用。
boost::asio::buffer(&t,sizeof(t))
会更有效率。如果需要,打开/关闭包装。