簡體   English   中英

使用帶有proto buffer的protobuffer

[英]using protobuffer with boost asio

我基於boost asio從客戶端發送數據時遇到問題。
1.我正在使用protobuffer來序列化數據。
2.我正在使用寫功能:
boost::asio::write(socket, data, boost::asio::transfer_exactly(65536)) ;
據我了解,我無法在這種情況下使用此方法。 編譯后出現以下錯誤:

c:\\ local \\ boost_1_55_0 \\ boost \\ asio \\ buffer.hpp(266):可能是'boost :: asio :: const_buffer&boost :: asio :: const_buffer :: operator =(const boost :: asio :: const_buffer&) '1>試圖匹配參數列表'(boost :: asio :: const_buffer,char)'

我正在使用此客戶端發送數據:

#include <boost/asio.hpp>
#include <iostream>
#include <cstdlib>
#include <string>
#include <boost/array.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include<windows.h>
#include<conio.h>
#include <thread>
#include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp>
#include "test.pb.h"
#include <boost/thread/thread.hpp>
//#include "test.pb.cc" - this was the problem (you should only include *.h files)
using namespace std;
using boost::asio::ip::tcp;



int main()
{
try {

// connect to the server:
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
string server_address = "localhost";
string server_port = "55555";

tcp::resolver::query query(server_address, server_port);
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::socket socket(io_service);
boost::asio::connect(socket, endpoint_iterator);
while ( true) 
{
Person p = Person();
p.set_id(22);
p.set_name("some name");

cout << p.id();
cout << p.name();
string data; // this will hold serialized data
    bool ok = p.SerializeToString(&data);
string buffer;
int size = 1024;
void handler(
    const boost::system::error_code& error, // Result of operation.
    std::size_t bytes_transferred           // Number of bytes read.
    ); 
// send a chunk of a particular size
//int bytes_to_send = std::min(3056, data.size());
cout << data.size() << endl;  // shows amount of remaining data
boost::asio::write(socket, data, boost::asio::transfer_exactly(65536));
cout << data.size() << endl;  // shows a reduction in amount of remaining data

}

     }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }
    cout << "\nClosing";
    _getch();
}

您需要調整字符串以用作Asio緩沖區:

boost::asio::write(socket, boost::asio::buffer(data), boost::asio::transfer_exactly(65536));

write返回write的字符數。

看起來有點像您實際上想要的是boost::asio::streambuf

在Coliru上 實時 觀看

#include <boost/array.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/thread/thread.hpp>
#include <cstdlib>
#include <iostream>
#include <string>
#include <thread>
//#include "test.pb.cc" - this was the problem (you should only include *.h files)
//#include "test.pb.h"

using boost::asio::ip::tcp;

struct Person {
    int id() {return 42;}
    const char* name() {return "name";}
    void set_id(int) {}
    void set_name(const char*) {}

    bool SerializeToString(std::string* data) const { if (data) *data += "someserializedform"; return data; }
};

int main()
{
    try
    {
        // connect to the server:
        boost::asio::io_service io_service;
        tcp::resolver resolver(io_service);
        std::string const server_address = "localhost";
        std::string const server_port    = "55555";

        tcp::resolver::query query(server_address, server_port);
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
        tcp::socket socket(io_service);
        boost::asio::connect(socket, endpoint_iterator);
        while ( true)
        {
            Person p = Person();
            p.set_id(22);
            p.set_name("some name");

            std::cout << p.id();
            std::cout << p.name();

            std::string data; // this will hold serialized data
            bool ok = p.SerializeToString(&data);
            assert(ok);

            std::cout << data.size() << std::endl;
            boost::asio::write(socket, boost::asio::buffer(data), boost::asio::transfer_exactly(65536));
            std::cout << data.size() << std::endl;  // shows a reduction in amount of remaining data
        }

    }
    catch (std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }
    std::cout << "\nClosing";
    std::string dummy;
    std::cin >> dummy;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM