0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ソケットプログラミングで学習したことをまとめてみた③(close();, shutdown();について)

Posted at

はじめに

こんにちは。
42tokyoといったところで、コンピュータサイエンス?を学んでいます。
最近、簡単なIRCサーバを実装する課題を通して、ソケットプログラミングについて学びました。
本記事は、close();やshutdown();の働きについてまとめています。

間違い等があれば、ご指摘ください。

本記事は、TCP/IP上で行われる通信を想定しています。

参考

全体図

スクリーンショット 2024-06-21 17.30.51.png

close();を実行したときの処理に流れ

1. 「送信バッファ」にあるデータを、全て「受信バッファ」に送る

今回は、「受信バッファ」に十分な空きがあることを想定している。

スクリーンショット 2024-06-21 17.16.27.png

2. TCPハンドシェイクメッセージ(切断)を送信

これ以上データを送らないことを相手に伝える意味を持つ。

スクリーンショット 2024-06-21 17.17.19.png

3. ソケットディスクリプタの割り当てを解放する

「ソケットの状態」が「Closing」になり、プログラムは制御を返す。

スクリーンショット 2024-06-21 17.38.10.png

4. 相手からの肯定応答を受け取る

「ソケットの状態」が「Half-Closed」になる

スクリーンショット 2024-06-21 17.39.05.png

5. 相手側の切断処理が始まる

スクリーンショット 2024-06-21 17.40.01.png

6. TCPハンドシェイクメッセージ(切断)が送られてきたら肯定応答する

  • 「ソケットの状態」が「Time-Wait」になる

スクリーンショット 2024-06-21 17.41.08.png

  • 以降、このTCPコネクションでのデータ送信はできない
  • この状態のソケットに、bind();できない
    (他のソケットがこの状態のソケットのローカルポートにバインドされない)
    (再接続時、前接続時に送られてきたデータを、今回接続時のデータとして処理することを防ぐ)
  • 「ソケット構造体」の割り当ては、しばらく残る

close();とshutdown();の違いと共通点

違い

close();

  • 両方向のデータ転送が切断される
  • ソケット関連のfdの割り当てが解除される
  • 受信バッファにあるデータは破棄される

shutdown();

  • ソケットによるコネクション切断を制御する
  • 切断するコネクションの方向を指定できる

共通点

  • TCPハンドシェイクメッセージ(切断)の完了を待たずに制御を返す

さいごに

不備がありましたらお申し付けください。
ありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?