返信

まず,ソケットとコネクションの基本から確認してみましょう。
コネクションの両端にデータの出入り口とも言えるソケットがあります。
そして,送受信バッファはソケット毎に別々に用意されます。
このソケットの一方にデータをwriteすると,
コネクションの中をデータが流れて行き,
相手側のソケットにデータが届き,
そして,相手側のソケットでデータをreadすると,そのデータが出てくるわけです。

で,下の状況だと,コネクションが二つあって,
それぞれのコネクションに対応する格好でサーバ側のソケットも二つあるわけです。

> IPアドレス  ポート番号   IPアドレス  ポート番号  送信データ
>  XXX      9000      YYY     1132     ABCDE
>  XXX      9000      YYY     1133     1234567890

そして,たとえば,
上のコネクションに対応するソケットからデータをreadすると『ABCDE』が出てきて,
下のソケットからreadすると『1234567890』が出てきます。
ソケットはコネクションの両端にあって,
そのコネクションに対するデータの出入り口としての役割を持つわけですから,
こういうことになります。

もし,上のソケットで『ABCDE』をreadした後,引き続いてreadを実行すると,
『ABCDE』の次のデータを読み出すことになります。
そのとき,まだ次のデータが到着していなかったら,それが到着するまで,
アプリケーションは待ち状態になります。
つまり,上のソケットで『1234567890』を読み出すことはできないんです。
下のソケットも同様ですし,
クライアント側のソケットも同じです。

二つのコネクションのデータが入り混じってしまったり,
readのタイミングによって受け取るデータが違ったりすると,
プログラムの動きは不確定になってしまいますから,
そんな仕組みは使い物になりませんよね。

それから,ソケットが二つあるということは,
acceptは2回実行する,ということです。
そして,そこから返ってくるディスクリプタも
それぞれのソケットに対応する格好で別々の値が二つあることになります。
もし,この辺を正しく理解しておらず,
ディスクリプタを入れる変数を一つしか用意していないと,
前のソケットのディスクリプタが上書きされて消えてしまい,
おかしなことになります。

こんな説明でわかります?

<code>Only

  • 使用できるHTMLタグ: <code>
  • 文字で図を描く場合に<code>と</code>で囲んでください
画像認証
機械的なスパムメッセージ送信を防止するために画像認証を設けています。ご協力ください。
Image CAPTCHA
Enter the characters shown in the image.