はじめに
こんにちは。
42tokyoといったところで、コンピュータサイエンス?を学んでいます。
最近、簡単なIRCサーバを実装する課題を通して、ソケットプログラミングについて学びました。
本記事は、send();やrecv();の働きについてまとめています。
間違い等があれば、ご指摘ください。
本記事は、TCP/IP上で行われる通信を想定しています。
参考
send();からrecv();までのデータの流れについて
- send();は、データを「送信バッファ」に送る
- TCPプロトコルは、データを「送信バッファ」から相手先の「受信バッファ」に送る
- recv();は、データを「受信バッファ」から引数で受け取ったバッファに入れる
この処理の流れで、send();とrecv();の動きは連動(対応)しない
つまり、send();は3回実行されたが、recv();は1回しか実行されていない。
といったことが発生する。
デッドロックについて
- 互いに送受信を行うプログラム間の通信で、両者が同時に送信したとき、デッドロックが発生する場合がある
前提
- 「送信バッファ」や「受信バッファ」には、容量がある(以降、これらの容量をそれぞれ「送信バフサイズ」、「受信バフサイズ」と呼ぶ)
- send();やTCPプロトコル?は、送信先の「xxバッファ」が満杯のとき、空きができるまで処理を停止する
- 送信先の「xxバッファ」に空きができると、データの送信を再開する(これを全てのデータを送り切るまで行う)
(例) 「受信バフサイズ」が5の「送信バッファ」に対して、サイズが14のデータをsend();するとき
さいごに
今回は、言葉にするのが難しかったので図を多用してみました。
不備があればお申し付けください。
次回は、ソケットの切断処理についてまとめていきます。
ありがとうございました。