問題タブ [boost-asio]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - この単純なBoost::asioプログラムが期待どおりに機能しないのはなぜですか?
私はこれを書いた:
次に、ターミナルに移動し、telnet localhost 1033と記述しました。Telnetは接続されていると言いますが、ハンドラーは呼び出されません(gdbはブレークポイントに到達せず、coutSは効果がありません)。プログラムを強制終了すると、telnetは接続が閉じられたと表示します。接続が安定しているように見えますが、なぜハンドラーが呼び出されないのですか?
編集:
奇妙なことに、start()でstartAccept()の後にioservice.run()を配置すると機能します。なぜこれが機能するのか疑問に思います...実際、後でstart acceptを再度呼び出しても機能しますが、それはioservice.run()呼び出しの後であります...。
c++ - boost::asio のソケットから読み取れるデータがあるかどうかを確認するにはどうすればよいですか?
Boost ASIO ライブラリを使用して TCP クライアント プログラムを作成しています。
プロトコルは、接続時にバナー行で始まり、その後に「\r\n」が続きます。smtp のように、いつでもコマンドを送信できます。
ただし、サーバーは、要求していないときにデータを送信することもでき、「\r\n」で終了します
初期接続バナーを読み取って解析するために、このような行があります。つまり、「\r\n」が表示されたら読み取りを停止します。
しかし、さまざまなときに質問をしたいのですが、利用可能なデータはありますか? ある場合は、「\r\n」まで読み取ります。ピーク機能が必要な気がしますが、それがどこにあるのかわかりません。
わかりました、おそらく async_read_until をもう一度呼び出すことができます。しかし、これを考えてみてください... それは決して終わりません。読み続けるデバッグが 1 回表示されます。明らかに、完了するのを永遠に待っていますが、決して完了しません。
わかりました、私は今それを得ると思います。私のコードを基にするのに十分な完全な例を見ていませんでした。
次のように呼び出します。
boost::asio::async_read_until(socket_, response_, "\r\n", boost::bind(&client::HandleReadRequest, this, boost::asio::placeholders::error)); \r\n が response_ バッファに現れると、関数 HandleReadRequest が呼び出されることを意味します。async_read_until を 1 回だけ呼び出す必要があります。書き込み要求が呼び出されない限り、もう一度読み取りを行う必要があります...表示されます...まあ、少なくとも今は動作しています。
c++ - Asio の非同期と同時実行
boost::asio
非同期TCP接続を使用して、でコードを書いています。私はそれについていくつかの疑問を持っていることを認めざるを得ません. これらはすべて並行性に関するものです。ここにあるいくつかの:
async_write
最初のソケットの完了を待たずに同じソケットで2 つ以上を開始するとどうなりますか? ハンドラ (およびasync_write
) はオーバーラップしますか、それともasio
シリアライゼーションと同期を提供しますか?上記と
async_connect
との同じ質問async_read
。一般に、これらの関数を異なるスレッドから呼び出すことは安全です (異なるバッファーの使用について話しているわけではありません。それは別の問題です...)。
c++ - より良いブーストasioのdeadline_timerの例
私はより良い例を求めていますboost::asio::deadline_timer
与えられた例は、常にタイムアウトしてclose
メソッドを呼び出します。タイマーで呼び出しcancel()
てみましたが、渡された関数がasync_wait
すぐに呼び出されます。
非同期TCPクライアントでタイマーを操作する正しい方法は何ですか?
c++ - io_service::run() 専用スレッド
io_service
1 つのグローバル スレッドによって駆動されるグローバルを提供したいと考えています。簡単に言えば、スレッド本体の call があるだけio_service::run()
です。ただし、やるべきことがなければrun
( run_one
, poll
, poll_one
) が返されるので、それは機能しません。しかし、スレッドが run() を繰り返し呼び出すと、何もすることがないときにビジー ループになります。
io_service で実行する作業がない間にスレッドをブロックする方法を探しています。スレッドをブロックするグローバル イベントをミックスに追加できます。ただし、その場合、 のユーザーはio_service
、サービスを使用するたびにイベントを通知する必要があります。理想的なソリューションではありません。
注:実際のグローバルはなく、同時実行のためにイベントを使用することはありません。問題を正確に必要なものまで単純化しただけです。本当の目標は、構築パラメータとして をasio::deadline_timer
必要としないサブクラスです。io_service
c++ - ブーストasioio_service.run()
asioチャットサーバーの例を調べていました。私の質問は、io_service.run()
関数の使用法についてです。io_service.run()
関数のドキュメントには次のように書かれています。
run()関数は、すべての作業が終了してディスパッチするハンドラーがなくなるまで、またはio_serviceが停止するまでブロックします。複数のスレッドがrun()関数を呼び出して、io_serviceがハンドラーを実行できるスレッドのプールを設定する場合があります。プールで待機しているすべてのスレッドは同等であり、io_serviceはそれらのいずれかを選択してハンドラーを呼び出すことができます。run()関数は、reset()を呼び出した後でのみ完了すると、安全に再度呼び出すことができます。
run関数が返されると書かれており、返されるとネットワークスレッドは再度呼び出されるまで停止すると思います。それが本当なら、なぜ実行関数がループで呼び出されないのか、少なくとも独自のスレッドが与えられないのですか?機能は私にio_service.run()
はかなり謎です。
c++ - boost::asio および boost::iostreams を使用した非同期のノンブロッキング ファイルのロードに関するヘルプが必要 (または別の何か?)
私は c++ でコーディングしており、画像ファイルを非同期で読み込もうとしています。いくつかの調査の後、boost::asio と boost::iostreams を使用してそれを行うことについての言及がいくつか見つかりました。ただし、boost::asio のドキュメントと例はほとんどがソケット関連であるため、あまり役に立ちません。
必要なものは次のとおりです。
- ファイルを非同期にロードし、ロード完了時にコールバック関数を実行します。 (私の場合、コールバック関数は v8 JavaScript エンジンを使用して JavaScript 関数オブジェクトを実行します)
- コールバック関数は、メイン関数と同じスレッド内で実行する必要があります。(v8はスレッドセーフではないため。)
- Linux と Windows で作業する必要があります。(個別の実装は問題ありません)
したがって、このようなものは本当にいいでしょう:
関数はブロックされるべきではなく、ファイルの読み込みが完了すると、「the_callback_function」を実行する必要があります。
編集: ジョシュペリーが指摘したように、boost::asio はメインスレッドにディスパッチできない可能性があります。したがって、boost::asio と boost:iostreams のみに制限する必要はないと思います。この要件を満たすことができる c/c++ ライブラリは問題ありません。ありがとう!
c++ - 一般的なブーストasioストリームは質問を読みます
asioでデータをストリームに読み込む方法について少し混乱しています。私の主な質問は次のとおりです。
- 1台のコンピューターからの複数の非同期書き込みが同時に実行されており、受信側コンピューターで1回の非同期読み取りのみが行われている場合はどうなりますか。TCPプロトコルを介して、データがインターリーブされる可能性はありますか?
- ASIOライブラリは、読み取りストリーム内の新しいデータを処理するハンドラーをいつ呼び出すかをどのように認識しますか?受信したすべてのバイトを呼び出しますか?クライアントが切断したとき?
- asioを使用してtcpソケットから読み取るためのバッファーではなく、ストリームを使用する良い(そして単純な)例はありますか?
ありがとう。
c++ - boost::asio のきれいな切断
時々、boost::asio は私が望む前に、つまりサーバーが切断を適切に処理する前に切断するように見えます。クライアントはメッセージを完全に送信したと考えているように見えるため、これがどのように可能かはわかりませんが、サーバーがエラーを発したときにメッセージヘッダーを読み取っていません...テスト中、これはおそらく5回に1回しか発生しません。サーバーはクライアントのシャットダウン メッセージを受信し、クライアントを正常に切断します。
エラー: 「既存の接続がリモート ホストによって強制的に閉じられました」
クライアントの切断:
サーバー:
c++ - async_read_until のヘルプ
ここに記載されている関数の 3 番目のパラメーターの実装に問題があります : http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/reference/async_read_until/overload4.htmlできることは、async_read_until の 3 番目のパラメーターでコールバックを使用して、完全なチャンクがいつ到着したかを検出することです。私のパケットは次の形式です。
- 1 バイト ID (データの意味論的意味)
- unsigned int (一部のデータ チャンクはサイズが変わる可能性があるため、データのバイト数)
- ペイロード
ドキュメントのサンプル コードを見ると、開始イテレータと終了イテレータから unsigned int は言うまでもなく、バイトを抽出する方法について少し混乱しています。イテレータを次のようにインスタンス化しました
typedef boost::asio::buffers_iterator<
boost::asio::streambuf::const_buffers_type> iterator;
しかし、それでも const_buffers_type が何であるかがわからないため、それがどのタイプかはわかりません。ドキュメントのいくつかのリンクをたどったところ、「実装定義」であることがわかりましたが、間違っている可能性があると思います。したがって、私の2つの具体的な質問は次のとおりです。
- これら 2 つの反復子を使用して unsigned int を読み取るにはどうすればよいですか?
- これらのイテレータはどのタイプを指していますか?
ありがとう!