无论如何基本上都要做以下事情:
#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'。
答案 0 :(得分:7)
使用多个缓冲区的scatter操作:
#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;
}
请注意,您需要在接收方使用相应的聚集。除了你提出的人为例子之外,这一点非常繁琐。这就是I suggested在previous question中使用更强大的序列化机制的原因。
答案 1 :(得分:3)
只需使用Boost.Serialization 您可以从http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/examples.html
获取演示如果要发送对象,最好先将其序列化。
答案 2 :(得分:2)
您需要注意一些事项。
<强> 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支持字节顺序切换),您的成员的字节可能会反转。您必须检测主机体系结构的字节顺序,并将字节交换为预定义的顺序,以便在协议中使用。