Trying to do Serialization with Struct

Viewed 39

I am trying to use the examples from https://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/example/serialization

But, in my case, I would like to send the struct from client to server. I changed the read and write in the respective client and server. However, I am receiving the following error:

error: ‘s11n_example::connection_ptr’ {aka ‘class boost::shared_ptr<s11n_example::connection>’} has no member named ‘async_read’
   conn.async_read(packet_, on the server side. 

Any suggestions on how to resolve ?

Client:

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <vector>
#include "connection.hpp" // Must come before boost/serialization headers.
#include <boost/serialization/vector.hpp>
#include "info.hpp"

namespace s11n_example {


class client
{
  public:
     client(boost::asio::io_service& io_service,
     const std::string& host, const std::string& service)
     : connection_(io_service)
 {

    Packet p;
    p.a = 3;
    p.b = 2;
    packet_.push_back(p);

    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query(host, service);
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator =
    resolver.resolve(query);

    boost::asio::async_connect(connection_.socket(), endpoint_iterator,
      boost::bind(&client::handle_connect, this,
      boost::asio::placeholders::error));
    }


    void handle_connect(const boost::system::error_code& e)
  {
   if (!e)
   {
       connection_.async_write(packet_,
         boost::bind(&client::handle_write, this,
           boost::asio::placeholders::error));
    }
     else
   {
      std::cerr << e.message() << std::endl;
   }
  }

   void handle_write(const boost::system::error_code& e)
   {

   }

private:
   connection connection_;

   std::vector<Packet> packet_;
 };

} // namespace s11n_example

    int main(int argc, char* argv[])
  {
    try
 {
// Check command line arguments.
  if (argc != 3)
 {
  std::cerr << "Usage: client <host> <port>" << std::endl;
  return 1;
   }

   boost::asio::io_service io_service;
   s11n_example::client client(io_service, argv[1], argv[2]);
  io_service.run();
}
 catch (std::exception& e)
 {
std::cerr << e.what() << std::endl;
}

 return 0;
  }

Server:

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/lexical_cast.hpp>
#include <iostream>
#include <vector>
#include "connection.hpp" // Must come before boost/serialization headers.
#include <boost/serialization/vector.hpp>
#include "info.hpp"

namespace s11n_example {

{
public:
 
  server(boost::asio::io_service& io_service, unsigned short port)
    : acceptor_(io_service,
        boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port))
  {
    // Create the data to be sent to each client.
    

    // Start an accept operation for a new connection.
    connection_ptr new_conn(new connection(acceptor_.get_io_service()));
    acceptor_.async_accept(new_conn->socket(),
        boost::bind(&server::handle_accept, this,
          boost::asio::placeholders::error, new_conn));
  }

 
  void handle_accept(const boost::system::error_code& e, connection_ptr conn)
  {
    if (!e)
    {
    
      conn->async_read(packet_,
          boost::bind(&server::handle_read, this,
            boost::asio::placeholders::error));
    }

   
    connection_ptr new_conn(new connection(acceptor_.get_io_service()));
    acceptor_.async_accept(new_conn->socket(),
        boost::bind(&server::handle_accept, this,
          boost::asio::placeholders::error, new_conn));
  }

  
  void handle_read(const boost::system::error_code& e, connection_ptr conn)
  {
   
  }

private:
  /// The acceptor object used to accept incoming socket connections.
  boost::asio::ip::tcp::acceptor acceptor_;

  /// The data to be sent to each client.
  std::vector<Packet> packet_;
};

} // namespace s11n_example

int main(int argc, char* argv[])
{
  try
  {
    // Check command line arguments.
    if (argc != 2)
    {
      std::cerr << "Usage: server <port>" << std::endl;
      return 1;
    }
    unsigned short port = boost::lexical_cast<unsigned short>(argv[1]);

    boost::asio::io_service io_service;
    s11n_example::server server(io_service, port);
    io_service.run();
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

Info

#ifndef Packet_HPP
#define Packet_HPP


namespace s11n_example {

/// Structure to hold information about a single stock.
struct Packet
{
 int a;
 int b; 

  template <typename Archive>
  void serialize(Archive& ar, const unsigned int version)
  {
    int a;
    int b;
  }
};

} // namespace s11n_example

#endif 
0 Answers
Related