問題タブ [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++ - 着信接続用のフィルターの作成
Win7でC++/ boost::asioを使用しています。
特定のTCP/IPポートを介してトラフィックを「スニッフィング」しようとしています。したがって、私はそのポートでリッスンし、メッセージを受信し、それらを分析するだけでなく、それらを傍受したことがないかのように、すぐにそれらをさらに流すことを許可したいと思います。私は彼らに、通常はそのポートでリッスンして接続するプログラムに沈んでもらいたい。透過プロキシを想像してみてください。HTTP用ではありません。
コードベースのソリューションを見つけたいのですが、それを除けば、ツールを提案するかもしれません。
c++ - boost.asioの例をコンパイルするときのリンカーエラー
boost.asioの例をコンパイルしようとしていますが、次のリンカーエラーが発生します:「_Unwind_Resume'" and "undefined reference to
__gxx_personality_v0'への未定義の参照」。私は長い間グーグルを検索してきましたが、何も役に立ちませんでした。どのライブラリをリンクする必要がありますか?前もって感謝します!
c++ - Boost.ASIOのパフォーマンスが悪い
Windowsでboost::asioを使用した非常に単純なサーバー/クライアントパフォーマンステストがありますが、パフォーマンスが非常に悪いようです。ライブラリを誤って使用しているだけで、アドバイスをいただければ幸いです。
メッセージの長さを書き込んでからメッセージを書き込んでから、メッセージの長さを読み取ってからメッセージを読み取るのを待って、これをノンストップで何度も繰り返し実行するセッションクラスがあります。ただし、自分のコンピューターでローカルに実行すると、非常に高速なパフォーマンスが得られます。同じネットワーク上であっても、あるコンピューターでサーバーを実行し、別のコンピューターでクライアントを実行すると、パフォーマンスが低下し、読み取り/書き込み操作が発生するまでに1秒もかかります。
サーバーのソースコードファイルは次のとおりです。
また、クライアントコードは次のとおりです。
助けていただければ幸いです、ありがとう。
私の目的では、非常に小さなメッセージを送信し、仮想リアルタイムの応答が必要な場合、Nagleのアルゴリズムを無効にすることが、パフォーマンスの低下の原因であることが判明しました。
c++ - Boost.ASIOのソケットクラスからネイティブソケットを切り離す
Boost.ASIOのソケットクラスからネイティブソケットをデタッチすることは可能ですか?もしそうなら、それはどのように行うことができますか?ドキュメントに明らかなものが見つからないようです。
私が達成しようとしていることの簡単な概要として:接続を確立し、Boost.ASIOを使用してネゴシエーションを行い、成功した場合はネイティブWindows SOCKETを、失敗した場合は0を返すクラスがあります。
私が間違っていない限り、boost :: asio :: basic_socketが破棄されると、ネイティブソケットは閉じられ、割り当てが解除されます。
sockets - バッファに読み込まずに boost.asio ストリームで読み込むデータがある場合、どうすればコールバックを取得できますか?
ブースト 1.40.0 以降、async_read_some()
呼び出しの動作方法が変更されたようです。
以前は、 anull_buffer
を渡すことができ、読み取るデータがあるときにコールバックを取得できましたが、フレームワークがデータをバッファーに読み取ることはありませんでした (バッファーがなかったからです!)。これにより、基本的に、呼び出しのように機能するコードを記述できselect()
、ソケットにデータがあるときに通知されます。
新しいコードでは、動作が次のように変更されました。
シーケンス mb 内のすべてのバッファーの合計サイズが 0 の場合、非同期読み取り操作は直ちに完了し、読み取りバイト数を指定するハンドラーへの引数として 0 を渡します。
これは、ソケット上のデータを検出する私の古い方法 (そして、この公式の例に示されている方法) が機能しなくなったことを意味します。私にとっての問題は、asio ソケット ストリームの上に独自のストリーミング クラスを階層化しているため、これを検出する方法が必要なことです。そのため、ストリームが期待するソケットからデータを読み取ることはできません。現在考えられる唯一の回避策は、1 バイトを読み取って保存し、ストリーム クラスがいくつかのバイトを要求したときに、設定されている場合はそのバイトを返すことです。きれいではありません。
最新のboost.asioコードでこの種の動作を実装するより良い方法を知っている人はいますか?
c++ - boost::asio の非同期ファイル io を Mac OS X に拡張する
boost::asio パッケージには、Windows で IO 完了ポートを使用して非同期ファイル IO を実行するためのクラスが含まれています。私の理解では、asio パッケージに含まれる他のプラットフォームの非同期ファイル io はサポートされていません。
少なくとも Mac OS X の非同期ファイル io サポートを使用して asio を拡張するために何をする必要があるのか 疑問に思っていますが、Linux もある程度サポートしています。私は asio 側で何をする必要があるかということに主に興味がありますが、私は Mac OS X プログラミングの経験があまりないので、非同期ファイル io を実行する方法に関する詳細情報をどこで見つけるかについてのポインタは気にしません。 Mac OS X も - PBReadForkAsync を確認する必要がありますか?
更新: Mac OS X で aio_read/aio_write を使用して非同期ファイル io (boost::asio の外部) を構築しようとようやく試みましたが、必要なコールバック データを取得できません (「ユーザー データを取得する方法」を参照)。 Mac OS X の aio シグナル ハンドラー)。
boost - cMake で boost.asio を使用する
私はcMakeに比較的慣れていないので、プロジェクトでboost asioライブラリを使用しようとしています。
cMake で smart_ptr や lexical_cast などの他のブースト ライブラリを見つけることができましたが、インクルードしようとするとリンカー エラーが発生しますboost/asio.hpp
。
次に、CMakeLists.txtをから変更しようとしました
に
次に、cMake は and を要求しBoost_ASIO_LIBRARY_DEBUG
ますBoost_ASIO_LIBRARY_RELEASE
。私はこれを正しい方法で行っていますか?もしそうなら、これらのライブラリを見つけるためにcMakeをどこに向けるべきですか? (私はcMake 2.6とブースト1.40.0を使用しています)
c++ - boost::asio での単一ソケットへの複数の書き込み
前回の書き込みが完了する前に、boost::asio ソケットに 2 回目の書き込みを行おうとするとどうなるかについては、何もわかりませんでした。これは、多くの非同期プログラムで潜在的に発生する可能性のあるもののようです (最初の書き込みを行った後、プログラムは終了を待つ前に続行し、2 番目のメッセージが送信される可能性があります)。起こりうることをいくつか考えてみました (これは、すべての場合において、メッセージが async_write への 1 回の呼び出しで送信されることを前提としています)。
したがって、最初の送信でエラーが発生しないと仮定します。
- Asio は msg1、msg2 の順に送信します。単一の TCP パケットでも可能です。
- 2 番目の async_write 呼び出しは、msg1 が完了するまでブロックされます
- 結果は未定義です
msg1s でエラーが発生した場合、例外によって msg2 も中止されると思いますか?
また、関連付けられた io_service にスレッド プールがあるか、それとも単一のスレッドしかないかによって影響を受けますか?
安全でない場合、送信するメッセージのキューを維持し、それらを1つずつ送信し、書き込みハンドラーが例外をスローした場合に中止する単純なラッパーを作成した人はいますか?
c++ - ソケットおよびユーザー値への非同期書き込み (boost::asio の質問)
私は後押しするのはかなり新しいです。クロスプラットフォームの低レベル C++ ネットワーク API が必要だったので、asio を選択しました。これで、ソケットへの接続と書き込みに成功しましたが、非同期の読み取り/書き込みを使用しているため、要求を追跡する方法が必要です (必要に応じて、何らかの ID を取得する必要があります)。ドキュメント/リファレンスを調べましたが、ユーザー データをハンドラーに渡す方法が見つかりませんでした。考えられる唯一のオプションは、コールバックとして機能し、ID を追跡する特別なクラスを作成して渡すことです。コールバックとしてソケットに。より良い方法はありますか?それともそれを行うための最良の方法ですか?
c++ - Boost::boost::function パラメーターを使用してメソッドをバインドする
async_write に追加の boost::function を提供したいと思います。接続自体の HandleWrite 関数を最初に呼び出してから、提供された boost::function を呼び出します。
asio async_write にバインドする Connection のメンバーメソッド
HandleWrite を asio async_write にバインドし、ハンドラーの値として別のバインドを提供しようとしています。これはコンパイルされません。私は何を間違っていますか?
コンパイラから得られるエラー メッセージは次のとおりです。