1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

はじめに

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

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

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

参考

send();からrecv();までのデータの流れについて

  1. send();は、データを「送信バッファ」に送る
  2. TCPプロトコルは、データを「送信バッファ」から相手先の「受信バッファ」に送る
  3. recv();は、データを「受信バッファ」から引数で受け取ったバッファに入れる

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

この処理の流れで、send();とrecv();の動きは連動(対応)しない
つまり、send();は3回実行されたが、recv();は1回しか実行されていない。
といったことが発生する。

デッドロックについて

  • 互いに送受信を行うプログラム間の通信で、両者が同時に送信したとき、デッドロックが発生する場合がある

前提

  • 「送信バッファ」や「受信バッファ」には、容量がある(以降、これらの容量をそれぞれ「送信バフサイズ」、「受信バフサイズ」と呼ぶ)
  • send();やTCPプロトコル?は、送信先の「xxバッファ」が満杯のとき、空きができるまで処理を停止する
  • 送信先の「xxバッファ」に空きができると、データの送信を再開する(これを全てのデータを送り切るまで行う)

(例) 「受信バフサイズ」が5の「送信バッファ」に対して、サイズが14のデータをsend();するとき

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

  • このため「送信バフサイズ」+「受信バフサイズ」を超える大きさのデータをsend();した場合、送信先のプログラムが適切にrecv();を実行しないと、send();の処理が完了しない状態になる
    スクリーンショット 2024-06-21 13.30.24.png

  • これらより、送受信を行うプログラム間で、両者がともにrecv();待ちの状態になるとデッドロックが発生する
    スクリーンショット 2024-06-21 13.56.46.png

さいごに

今回は、言葉にするのが難しかったので図を多用してみました。
不備があればお申し付けください。
次回は、ソケットの切断処理についてまとめていきます。
ありがとうございました。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?