まず,ソケットとコネクションの基本から確認してみましょう。 コネクションの両端にデータの出入り口とも言えるソケットがあります。 そして,送受信バッファはソケット毎に別々に用意されます。 このソケットの一方にデータを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回実行する,ということです。 そして,そこから返ってくるディスクリプタも それぞれのソケットに対応する格好で別々の値が二つあることになります。 もし,この辺を正しく理解しておらず, ディスクリプタを入れる変数を一つしか用意していないと, 前のソケットのディスクリプタが上書きされて消えてしまい, おかしなことになります。
こんな説明でわかります?
More information about text formats
コネクションが二つあれば,ソケットも二つ
まず,ソケットとコネクションの基本から確認してみましょう。
コネクションの両端にデータの出入り口とも言えるソケットがあります。
そして,送受信バッファはソケット毎に別々に用意されます。
このソケットの一方にデータを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回実行する,ということです。
そして,そこから返ってくるディスクリプタも
それぞれのソケットに対応する格好で別々の値が二つあることになります。
もし,この辺を正しく理解しておらず,
ディスクリプタを入れる変数を一つしか用意していないと,
前のソケットのディスクリプタが上書きされて消えてしまい,
おかしなことになります。
こんな説明でわかります?