11

ブースト asio リファレンスを読み、チュートリアルを読み、いくつかの例を見ました。それでも、ソケットを破棄する方法がわかりません。

  1. close() を呼び出す必要がありますか、それともソケットのデストラクタによって行われますか?
  2. shutdown() を呼び出すタイミング
  3. shutdown() の効果は何ですか? 「送信または受信を無効にする」ことは承知していますが、これはどのように行われますか? ソケットを無効にした後、ソケットを使用して送受信するとどうなりますか?
  4. close() から予想されるエラー
4

2 に答える 2

10

これは複数の質問であるため、各部分に満足していただけるよう最善を尽くします。

1)デストラクタがソケットのクローズを処理するのは、ASIOソケットに関する私の経験です。ただし、TCP ソケットしか扱っていません。これを確認する最善の方法は、デストラクタのコードを調べて、クローズに似た動作をするかどうかを確認することです。Boost コードは少し扱いに​​くいので、UDP ソケットを開いて破棄する小さなサンプル プログラムを作成するのが最も簡単かもしれません。そうすれば、デバッガーでコードをステップ実行して、ロジックに従うことができます。

Boost の設計者は TCP ソケットでこれを考慮したので、UDP ソケットで同じことをしないとは想像しがたいです。

2)コードがフューチャーおよび/またはソケットでshutdown()実行されないようにする必要があると思われる場合にのみ呼び出します。通常は必要ありませんが、TCP ソケットでソケットが閉じられたときに強制的に を送信するのを見てきました (保留中の送信が処理されるデフォルトの「正常な」シャットダウンとは対照的に)。recvsendRST

3) ソケットは、2 つのチャネル形式の通信であると考えることができます。1 つは読み取り用、もう 1 つは送信用です。いずれか一方を独立してシャットダウンでき、もう一方がシャットダウンされても一方のチャネルを引き続き使用できます (つまり、送信のためにシャットダウンした後でも受信でき、その逆も可能です)。ソケットを閉じることは、recv と send の両方で shutdown を呼び出すことと同じです。

recv のためにシャットダウンすると、コードがそれ以上データを読み取れなくなります。そうしようとすると、ソケット エラーが発生します。同様に、接続の反対側があなたにデータを送信しようとすると、エラーが発生します (再び TCP の世界に切り替えて申し訳ありませんがRST、送信者に返信されると思います)。

同様に、送信のためにシャットダウンすると、コードがそれ以上データを送信できなくなります。メモリが正しく機能している場合、これはソケットを閉じたときに起こることと同じように見えます (特定のチャネルがシャットダウンされたことを反対側に知らせるために長さゼロのパケットが送信されます)。今後送信しようとすると、エラーが返されます。

4) 確かなことを知るには、ドキュメントを確認する必要があります。 MSDNはかなり良い指標を提供してくれますが、私がそれを信頼できると見なすかどうかはわかりません。

于 2009-11-09T17:46:24.040 に答える
1

Boost Web サイトにある例から、単純に close() を使用する必要があるように見えます。たとえば、これを見てください:

ボイド接続::停止()
{
  socket_.close();
}

このアドレスから取得: HTTP サーバー

于 2011-05-12T18:57:06.353 に答える