2011-06-22 36 views
3

閉じるを使用してキャンセルしない場合、いくつかの問題があります。boost :: asio :: ip :: tcp :: socket :: cancel()とsocket :: close()を使用する

close関数はソケットを閉じることができ、未解決の非同期操作はboost::asio::error::operation_abortedエラーを返して停止します。

の代わりにcancelを使用する理由を教えてください。

非同期操作が実行されていると心配ですが、cancelはキャンセルできませんでしたか?

asio::ip::tcp::resolve::cancelと同じように、私は多くの時間がasync_resolveを呼び出した後resolve_handlerをキャンセルしようとしたが、resolve_handlerは常に無boost::asio::error::operation_abortedエラーで返されます。

私はresolve_handlerが実行されていると思いますか?

はい?

答えて

6

キャンセルは、ソケットを閉じずに保留中の操作を停止したい場合に便利です。 Boost documentationは(ドキュメントのページから)移植性を高めるために近い使用することをお勧めしますことを

注:

  • :以下 の選択肢のいずれかを使用して

    ...ポータブルのキャンセルについては 、考える BOOST_ASIO_DISABLE_IOCPを定義して、ASIOのI/O完了ポート バックエンドを無効にします。

  • close()関数を と同時に実行して、未処理の操作をキャンセルし、 ソケットを閉じます。
+1

ただし、キャンセル()の注釈も状態* Windows Vista、Windows Server 2008、およびそれ以降では、CancelIoEx関数が常に使用されます。この機能には上記の問題はありません。 –

+0

サム・ミラーに助けていただきありがとうございます。 –

6

cancelは、ソケットを閉じるので、あなたは、ソケットオブジェクトを引き続き使用する場合はcancelを使用しません。特に、ソケットのメンバ関数を参照する非同期ハンドラメソッドにコードがある場合、現在実行中の非同期ハンドラが完了するまでソケットを閉じたくない場合があります。

cancelは、socket::cancel()コールの場合、(この機能により、すべての未処理の非同期の接続、送信、および受信操作がすぐに終了することを保証しています)、現在の非同期ハンドラについては何も保証されません。 、または "この関数は、resolver::cancel()呼び出しの場合、保留中の非同期操作をホストリゾルバに強制的に完了させます。この "完了"とは、boostが非同期ハンドラメソッドを呼び出すことを意味します。非同期ハンドラにキャンセルロジックを挿入する管轄はありません(ハンドラの実装についてはわかりません)。

あなたのロジックを非同期ハンドラメソッドに追加して、ソケット/リゾルバなどのケースを処理することをお勧めします。キャンセルされます。 cancelメソッドを呼び出す場合、このキャンセルを非同期ハンドラメソッドに通知する可能性があります。

+0

holtavoltは正しいですがclose()はより移植性がありますが、それはすべてあなたのものに依存しますやろうとしている。 – devyndraen

+0

あなたの助けをありがとう、はい、私はHTTP要求を処理し、これらのオブジェクトをstd :: dequeに入れて、1つのタスク、pop_front 1つのオブジェクトdeque、作業を完了するときに、私はコールバックfunc handle_connectをキャンセルしたい、このhandle_connect_timeoutまたはhandle_read_timeoutで、私は確信していない、接続のタイムアウト、私はソケットを閉じますが、接続と読み取りで、私は20秒のタイムアウトを設定するどちらを使用するのか、キャンセルするのか、閉じるか、今、私にとって最高のものは近いと思います –

関連する問題