2011-06-21 16 views
1

socket::close()が呼び出されると、ブーストのドキュメントによれば、非同期の送信、受信、または接続操作は直ちにキャンセルされ、 boost::asio::error::operation_abortedエラーで完了します。boost :: asio :: ip :: tcp :: socket :: cancelとsocket :: closeの違い

socket::cancelすべての未処理の非同期接続、送信、受信操作が直ちに終了し、キャンセルされた操作のハンドラにはboost::asio::error::operation_abortedエラーが送信されます。

どういう違いがありますか?

1つのソケット接続を終了したいとき、コールバックハンドラがboost::asio::error::operation_abortedで呼び出されるようにコールする必要がありますか?

答えて

6

Is there some difference between them?

はい。 cancel()メソッドは未処理の非同期操作をキャンセルしますが、close()メソッドはソケットを閉じます。 cancel()を使用してもソケットは閉じません。

When I want to finish one socket connection, which one I should to call?

あなたは未処理の非同期操作を停止するcancel()を使用する必要があります。ソケットはデストラクタによって閉じられます。

+0

私は近くで使用してキャンセルしない場合、いくつかの問題がありますか? close関数はソケットを閉じることができ、未処理の非同期操作は、boost :: asio :: error :: operation_abortedエラーを返すことで停止します。なぜなら、非同期操作が実行されている場合、close.iではなくcancelを使用する必要があるからです。キャンセルしますか? asio :: ip :: tcp :: resolve :: cancelのように、私はasync_resolveを呼び出した後にresolve_handlerをキャンセルするのに多くの時間を費やしますが、resolve_handlerは常にboost :: asio :: error :: operation_abortedエラーを返さないでください。実行?はい? –

+0

@xiaoソケットを閉じる場合は、closeを使用しても問題はありません。 async_resolveに関する追加の質問をすることをお勧めします。私の答えがあなたを助けてくれたら、それを受け入れてください。 –

関連する問題