2012-06-21 5 views
0

Я пытаюсь отправить длину префиксного буфера на сокете. Я использую буфер протокола. Я googled вокруг, и я узнал, что это может быть достигнуто с использованием WriteVarint32, присутствующего в CodedOutputStream. Но все примеры используют либо поток файлов, либо boost asio. Нормальное гнездо посыла нуждается в пустоту * в качестве буфера для отправки через сокет, но когда сделано с помощью подталкивание ASIO я получаю следующую ошибкуТип потока буфера протокола для сокета send

error: invalid cast from type ‘boost::asio::const_buffers_1’ to type ‘void*’

Мой клиент сторона код

Person payload ; 
payload.set_log_msg("We are using protobuf"); 
boost::asio::streambuf b; 
std::ostream os(&b); 

ZeroCopyOutputStream *raw_output = new OstreamOutputStream(&os); 
CodedOutputStream *coded_output = new CodedOutputStream(raw_output); 

coded_output->WriteVarint32(payload.ByteSize()); 
payload.SerializeToCodedStream(coded_output); 
delete coded_output; 
delete raw_output; 
. 
. 
. 
bytecount=send(hsock, (void *) b.data(), 10,0); 

Содержание моего сообщения. прото файл

message Person { 
    required fixed64 log_time =1; 
    required fixed32 log_micro_sec =2; 
    required fixed32 sequence_no =3; 
    required fixed32 shm_app_id =4; 
    required string packet_id =5; 
    required string log_level=6; 
    required string log_msg=7; 

    } 

может ли один помочь мне в замене подталкивание :: ASIO :: streambuf с чем-то еще, так что я могу отправить его на обычный сокет отправить. Функция этого клиента заключается в отправке сообщений на сервер. И сервер, в свою очередь, записывает их в файл журнала после выполнения некоторого форматирования.

Благодарим вас заранее.

ответ

0

из boost::asio documentation

Доступ Буфер:

boost::asio::const_buffer b1 = ...; 
std::size_t s1 = boost::asio::buffer_size(b1); 
const unsigned char* p1 = boost::asio::buffer_cast<const unsigned char*>(b1); 

так что вы можете позвонить:

bytecount = send(hsock, 
       boost::asio::buffer_cast<const unsigned char*>(b.data()), 
       boost::asio::buffer_size(b.data()), 
       0); 
+0

г ++ client.cpp ../message.pb.o -I ../ - I/root/boost_1_41_0/-lprotobuf Client.cpp: В функции 'int main (int, char **)': Client.cpp: 100: ошибка: нет соответствующей функции для вызова в buffer_cast (boost :: asio: : streambuf &) ' Client.cpp: 101: ошибка: нет соответствующей функции для вызова в buffer_size (boost :: asio :: streambuf *)' /root/boost_1_41_0/boost/asio/buffer.hpp:148: примечание: кандидаты: size_t boost :: asio :: buffer_size (const boost :: asio :: mutable_buffer &) /root/boost_1_41_0/boost/asio/buffer.hpp:318: note: size_t boost :: asio :: buffer_size (const boost :: asio :: const_buffer &) получение ошибки – punith

+0

Собственно его oost :: asio :: buffer_cast (b.data()), спасибо за помощь – punith

+0

обновленный answaer – inkooboo

Смежные вопросы