2011-01-03 21 views
3

boost::asio::ip::udp::socketオブジェクトに書き込むためにboost::asio::write()を使用しようとしています。私はどこかで間違っていたかどうかを確認するためにドキュメントを再読するのに忙しいうちに、これがサポートされていないかどうかを誰かが確認できますか?私は今考えているboost::asio::write()はではなく、tcp::socketオブジェクトのみをサポートしています。C++:boost :: asio:write()はUDPソケットをサポートしていませんか?

これは私がコンパイルしようとすると、私が得るものです:

/usr/include/boost/asio/impl/write.ipp: In function ‘size_t 
boost::asio::write(SyncWriteStream&, const ConstBufferSequence&, [...cut...] 
test/test.cpp:76: instantiated from here 
/usr/include/boost/asio/impl/write.ipp:44: error: ‘class 
boost::asio::basic_datagram_socket<boost::asio::ip::udp, 
boost::asio::datagram_socket_service<boost::asio::ip::udp> >’ has no member named 
‘write_some’ 

私はドキュメントでこれを読んだとき、私はboost::asio::write()をしようとすることを決めたと思う:

を送信操作はすべて送信しなくてもよいですのデータをピアに送信します。あなたは、すべてのデータが が操作completes.`

をブロックする前に書かれていることを確認する必要がある場合は に書き込み機能を使用することを検討して...しかし、戻って、私は、テキストだけboost::asio::ip::tcp::socket::send()ではないであることを確認UDPバージョン。 Source.

答えて

4

同期動作が必要な場合は、boost::asio::ip::udp::socketクラスのメンバーメソッドsendまたはsend_toを使用する必要があります。 boost::asio::write空き関数は、UDPソケットが適合しないタイプ要求をSyncWriteStreamで使用します。

0

asio :: writeには、ストリームクラスでwrite_someが実装されている必要があります。 IIRC、UDPソケットに書き込むとき、断片化を減らすためにすべてを一度に書きたいと思っています(あなたのデータ+ UDPヘッダー+ IPヘッダーのサイズが> PMTUでないなら、先行する作業があります)。

受信側でUDPパケットを並べ替え/再構成するコードがありますか?あなたのネットワークがどれほどうまくいかなくても、UDPパケットは順不同で断片化します。

+0

アウトオブオーダーは問題ありません。私はちょうどudpソケットに書き込みたいが、boost :: asio :: write()がなぜ私にコンパイル時エラーを与えているのか理解できなかった。 –

1

代わりにasync_send_toを使用します。おそらくそれもあなたのために可能ですか? m_socketasio::ip::udp::socketある

void MyUdpServer::sendMessage(Message& message) 
{ 
    m_message = message; 

    m_socket.async_send_to(
     asio::buffer(&m_message, sizeof(m_message)), m_endpoint, 
     boost::bind(&MyUdpServer::handle_send_to, shared_from_this(), 
     asio::placeholders::error)); 
} 

+0

いいえ、コードの変更が過度に行われないように、可能であれば非同期呼び出しを避けようとしています。別のAPIのあなたの提案は高く評価されますが、何かがboost :: asio :: ip :: udp :: socket :: send()を使用するならば。 –

関連する問題