2011-04-15 24 views
3

boost :: asio :: streambufを使用して、boostをostreamに書き込んでいます。boost :: asio :: streambuf empty?

Name name; 
name.set_name("platzhirsch"); 

boost::asio::streambuf b; 
std::ostream os(&b); 

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

coded_output->WriteVarint32(name.ByteSize()); 
name.SerializeToCodedStream(coded_output); 

socket.send(b.data()); 

ただし、sendによって返されるsize_tは0です。データがまったく送信されないことは疑いがあります。また、クライアントソケットは恐ろしい例外をスローします。私のコードについて奇妙なことがあるかどうか、私は尋ねています。

つまり、streambufが空であるかどうか、またはそれに書き込まれたデータが実際に存在するかどうかをテストできますか?

答えて

1

これは、boost :: asioの問題ではなく、Googleのprotobufの問題でした。

CodedOutputStreamをフラッシュするために、彼らは削除する必要があります:

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

coded_output->WriteVarint32(name.ByteSize()); 
name.SerializeToCodedStream(coded_output); 

delete coded_output; 
delete raw_output; 

socket.send(b.data()); 
+1

あなたが動的にストリームを割り当てる必要はありませんが、代わりにスタックオブジェクトの寿命を制御するためにブロックを使用することができます。完全な回答については、http://stackoverflow.com/a/20397980/891439を参照してください。ソリューションを見つけるためにGoogleに多くのことをしなければならなかったので、私は完全性のためにこのコメントを追加しました。 –

+0

@FlorianWoltersあなた自身の答えを自由に追加してください。私は別の答えを受け入れてうれしく思います。 –

+0

私はコメントが十分だと思うが、タイ! –

3

コードが不明です。これは私のために働きます:

boost::asio::streambuf request; 
    std::ostream request_stream(&request); 
    request_stream << "GET " << queryArgs << " HTTP/1.0\r\n"; 
    request_stream << "Host: " << serverIp /* "192.168.0.70" */ << "\r\n"; 
    request_stream << "Accept: */*\r\n"; 
    request_stream << "Connection: close\r\n\r\n"; 

    // Send the request. 
    boost::asio::write(socket, request); 
関連する問題