2011-07-19 4 views
0

Unixソケットで書いたソフトウェアをboost :: asioを使ってTCPソケットのあるバージョンに移植しようとしています。このプログラムは、Linuxマシン上で動作するように設計されています。 (Unixソケットを使用して)、コードの以前のバージョンでread()の前にboost :: asioバッファデータが存在するかどうかを確認してください。

私は、ソケットバッファに新しいデータがあったかどうかを確認するための簡単なチェックを使用して、予想通り構造化データの読み込みを進め:

ioctl(s_c, FIONREAD, &socketstatus); 
    while (socketstatus > 0) 
    {// do receive stuff 
    ioctl(s_c, FIONREAD, &socketstatus);} 

ですboost :: asioと似た何かをする方法はありますか? またはいくつかのより良い選択肢?

は、あなたがあなたの既存のコードでうまく動作するべきか、native()methodを使用してboost::asio::ip::tcp::socketからネイティブの記述子を抽出することができ、事前に CB

+1

あなたはすでにブーストASIO [例](http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/examples.html)の非常に良いコレクションを読みになりましたブーストasio [チュートリアル](http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/tutorial.html)?多分あなたはそこに答えを見つけるでしょう。 – jenseb

答えて

3

bytes_readableを使用してください。これは、あなたが望むものを実装します。

FIONREAD IO制御コマンドを実装します。

boost::asio::ip::tcp::socket socket(io_service); 
... 
boost::asio::socket_base::bytes_readable command(true); 
socket.io_control(command); 
std::size_t bytes_readable = command.get(); 
+0

それだけです!本当にありがとう –

2

、ありがとうございました。

しかし、私はあなたがこれを行うためのあなたの動機に疑問を呈します。 Asioイベント・リアクターはepollを使用してポーリング・メカニクスを実装しています。Linuxです。 io_serviceイベントループの外部で読み書きするためにソケットをポーリングする必要はありません。

+0

どの意味で必要はないはずですか?私の目標は、データが利用可能な場合にのみ一定量のデータを読むことです。これを行うよりスマートな方法がありますか? –

+0

@Carlo 'io_service'があなたのためにポーリングを行います。 'async_read'または' async_write'で要求された完了条件が満たされると、完了ハンドラが呼び出されます。 –

関連する問題