boost :: asio :: ip :: udp :: socketをどのように分解する必要がありますか?

StackOverflow https://stackoverflow.com/questions/1222637

  •  10-07-2019
  •  | 
  •  

質問

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

  1. close()を呼び出すべきですか、それともソケットのデストラクタによって行われますか?
  2. shutdown()を呼び出すタイミング
  3. shutdown()の影響は何ですか? 「送信または受信を無効にする」ことを知っていますが、これはどのように行われますか?無効にされたソケットを使用して送受信する場合、どうなりますか?
  4. close()から期待できるエラー
役に立ちましたか?

解決

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

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

Boostの設計者はこれをTCPソケットについて考慮したため、UDPソケットに対して同じことをしないと想像するのは困難です。

2) shutdown()を呼び出すのは、コードが将来 recv send を実行するのを防ぐ必要があると感じた場合のみソケット。通常は必要ありませんが、TCPソケットで使用され、ソケットが閉じられたときに RST を強制的に送信するのを見ました(保留中の送信が処理されるデフォルトの「グレースフル」シャットダウンとは対照的です) )。

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

recvのシャットダウンは、コードがそれ以上データを読み取れないようにするだけです。そうしようとすると、ソケットエラーが発生します。同様に、接続の反対側があなたにデータを送信しようとすると、エラーが表示されます(TCPワールドに再度切り替えることはできませんが、 RST は送信者に返信されます)。

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

4)確実に知るためにドキュメントをチェックする必要があります。 MSDN を使用すると、かなり良い指標が得られます。しかし、私はそれが権威あると考えるかどうかは知りません。

他のヒント

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

void connection::stop()
{
  socket_.close();
}

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top