はじめに
こんにちは。
42tokyoといったところで、コンピュータサイエンス?を学んでいます。
最近、簡単なIRCサーバを実装する課題を通して、ソケットプログラミングについて学びました。
本記事は、close();やshutdown();の働きについてまとめています。
間違い等があれば、ご指摘ください。
本記事は、TCP/IP上で行われる通信を想定しています。
参考
全体図
close();を実行したときの処理に流れ
1. 「送信バッファ」にあるデータを、全て「受信バッファ」に送る
今回は、「受信バッファ」に十分な空きがあることを想定している。
2. TCPハンドシェイクメッセージ(切断)を送信
これ以上データを送らないことを相手に伝える意味を持つ。
3. ソケットディスクリプタの割り当てを解放する
「ソケットの状態」が「Closing」になり、プログラムは制御を返す。
4. 相手からの肯定応答を受け取る
「ソケットの状態」が「Half-Closed」になる
5. 相手側の切断処理が始まる
6. TCPハンドシェイクメッセージ(切断)が送られてきたら肯定応答する
- 「ソケットの状態」が「Time-Wait」になる
- 以降、このTCPコネクションでのデータ送信はできない
- この状態のソケットに、bind();できない
(他のソケットがこの状態のソケットのローカルポートにバインドされない)
(再接続時、前接続時に送られてきたデータを、今回接続時のデータとして処理することを防ぐ) - 「ソケット構造体」の割り当ては、しばらく残る
close();とshutdown();の違いと共通点
違い
close();
- 両方向のデータ転送が切断される
- ソケット関連のfdの割り当てが解除される
- 受信バッファにあるデータは破棄される
shutdown();
- ソケットによるコネクション切断を制御する
- 切断するコネクションの方向を指定できる
共通点
- TCPハンドシェイクメッセージ(切断)の完了を待たずに制御を返す
さいごに
不備がありましたらお申し付けください。
ありがとうございました。