2

私は現在、Boost.Asio を基礎となるソケット API として使用する TCP I/O 機能を作成していますが、Boost.Asio には、個々の操作の結果として特定の Boost エラー コード/条件が発生する可能性があるドキュメントがないように思われることに気付きました(例:関数/メソッド呼び出しまたは非同期操作)。私が見つけることができたのは、エラー コード API といくつかの非公式のエラー コード リストだけで、特定のコードを特定の操作に関連付けるものはありません

考えられる障害モードがわからない場合、堅牢なコードを作成するのは難しいため、この明らかなドキュメントの欠如は苛立たしいものです。ドキュメントが不足しているため、どの操作からどの問題が発生する可能性があるかについても確信が持てないため、例を挙げることさえできません。

それに比べて、POSIX ソケット API は、障害モードの文書化に関してはかなり適切です。特に、各関数呼び出しによって生成される可能性がある errno と戻り値をリストします。

この Boost.Asio のドキュメントはどこかにありますか? それとも、Boost.Asio API のさまざまな部分の障害モードに関する経験的データを推測、リバース エンジニアリング、または収集して、それを使用する堅牢なコードを記述できるようにする必要がありますか?

4

1 に答える 1

2

一般に、Boost.Asio が OS の実装に依存している場合、エラーが発生する条件や返される可能性のあるエラー コードは指定されません。失敗した場合、Boost.Asio はboost::system::error_code、非同期操作やerror_codeパラメーターを使用した同期操作のオーバーロードなど、アプリケーションがそれを受け取ることができる場合に値を設定します。それ以外の場合は、error_code. ドキュメントには次のように記載されています。

特に明記されていない限り、非同期操作の動作が POSIX 関数によって実装されているかのように定義されている場合、ハンドラーは、error_codeその関数の POSIX によって記述された失敗条件に対応する型の値で呼び出されます (存在する場合)。それ以外の場合、ハンドラーはerror_code、オペレーティング システムのエラーを反映する実装定義の値で呼び出されます。

非同期操作は、シグナル (POSIX ) による中断を示すエラー状態で失敗しませんEINTR。非同期操作は、非ブロッキング操作 (POSIXまたは; Windowsまたは)EWOULDBLOCKに関連するエラー状態で失敗することはありません。EAGAINEINPROGRESSWSAEWOULDBLOCKWSAEINPROGRESS

エラー処理が正確なエラー コードに依存する場合は、多くの場合、BSD API マッピング ドキュメントを使用して、どの OS 呼び出しが行われているかを判断できます。その後、適切な OS ドキュメントを使用して、エラーが発生する条件と値を判断できます。エラー コードと Boost.Asio エラー コード間のマッピングは 内asio/error.hppにありますが、マッピングは通常かなり単純です。

于 2015-07-27T21:48:17.243 に答える