sending/receiving a struct in boost::asio(在 boost::asio 中发送/接收一个结构体)
问题描述
我打算使用 boost::asio::async_write_some 从客户端向服务器发送一个结构体,在本例中为 boost::serialization 和 boost::property_tree 来帮忙,
I was going to send a struct from a client to a server using boost::asio::async_write_some, in this case boost::serialization and boost::property_tree come to help, 
//boost::serialization
struct blank
{
    int m_id;
    std::string m_message;
    template<typename archive>
    void serialize(archive& ar, const short version)
    {
        ar & m_id;
        ar & m_message;
    }
};
blank info;
info.m_id = 1;
info.m_name = "Rasul";
std::stringstream ss;
boost::archive::binary_oarchive out_archive(ss);
out_archive << info;
那么,现在我如何使用 boost::asio 异步发送/接收 out_archive .. 或
So, now how can I send/receive out_archive using boost::asio asynchronously .. or
//boost::property_tree
boost::property_tree::ptree root;
root.put("id", 2);
root.put("name", "Rasul");
如何使用 boost::asio 异步发送/接收根????(如果您有其他想法,请分享)
How can I send/receive root using boost::asio asynchronously???
(If you have some other ideas please share them)
推荐答案
好吧,完全不清楚您尝试了什么或问题是什么,所以您开始吧:
Ok, it's not clear at all what you've tried or what the problem is, so here you go:
生活在 Coliru强>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/asio.hpp>
#include <iostream>
//boost::serialization
struct blank
{
    int m_id;
    std::string m_message;
    template<typename archive> void serialize(archive& ar, const unsigned /*version*/) {
        ar & m_id;
        ar & m_message;
    }
};
void on_send_completed(boost::system::error_code ec, size_t bytes_transferred) {
    if (ec)
        std::cout << "Send failed: " << ec.message() << "
";
    else
        std::cout << "Send succesful (" << bytes_transferred << " bytes)
";
}
namespace ba = boost::asio;
using ba::ip::tcp;
struct IO {
    boost::asio::streambuf buf;
    void send_asynchronously(tcp::socket& socket) {
        blank info;
        info.m_id = 1;
        info.m_message = "Rasul";
        {
            std::ostream os(&buf);
            boost::archive::binary_oarchive out_archive(os);
            out_archive << info;
        }
        async_write(socket, buf, on_send_completed);
    }
};
int main() {
    ba::io_service ios;
    tcp::socket s(ios);
    s.connect({{},6868});
    IO io;
    io.send_asynchronously(s);
    ios.run();
}
当针对例如运行时netcat -l -p 6868 |xxd:
Send succesful (62 bytes)
00000000: 1600 0000 0000 0000 7365 7269 616c 697a  ........serializ
00000010: 6174 696f 6e3a 3a61 7263 6869 7665 0f00  ation::archive..
00000020: 0408 0408 0100 0000 0000 0000 0001 0000  ................
00000030: 0005 0000 0000 0000 0052 6173 756c       .........Rasul
Boost 属性树 + 序列化
一些变化:
生活在 Coliru强>
void send_asynchronously(tcp::socket& socket) {
    boost::property_tree::ptree root;
    root.put("id", 2);
    root.put("name", "Rasul");
    {
        std::ostream os(&buf);
        boost::archive::binary_oarchive out_archive(os);
        out_archive << root;
    }
    async_write(socket, buf, on_send_completed);
}
打印:
Send succesful (138 bytes)
00000000: 1600 0000 0000 0000 7365 7269 616c 697a  ........serializ
00000010: 6174 696f 6e3a 3a61 7263 6869 7665 0f00  ation::archive..
00000020: 0408 0408 0100 0000 0000 0000 0002 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0200  ................
00000040: 0000 0000 0000 6964 0000 0000 0000 0000  ......id........
00000050: 0000 0000 0100 0000 0000 0000 3204 0000  ............2...
00000060: 0000 0000 006e 616d 6500 0000 0000 0000  .....name.......
00000070: 0000 0000 0005 0000 0000 0000 0052 6173  .............Ras
00000080: 756c 0000 0000 0000 0000                 ul........
                        这篇关于在 boost::asio 中发送/接收一个结构体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在 boost::asio 中发送/接收一个结构体
				
        
 
            
        - STL 中有 dereference_iterator 吗? 2022-01-01
 - Stroustrup 的 Simple_window.h 2022-01-01
 - 一起使用 MPI 和 OpenCV 时出现分段错误 2022-01-01
 - 如何对自定义类的向量使用std::find()? 2022-11-07
 - C++ 协变模板 2021-01-01
 - 从python回调到c++的选项 2022-11-16
 - 静态初始化顺序失败 2022-01-01
 - 使用/clr 时出现 LNK2022 错误 2022-01-01
 - 与 int by int 相比,为什么执行 float by float 矩阵乘法更快? 2021-01-01
 - 近似搜索的工作原理 2021-01-01
 
						
						
						
						
						
				
				
				
				