質問: C++で2台のPC間でTCP通信を用いたソケット通信を行うプログラムを作っています。 現在は設計の段階です。 1つのプロセスの中で、サーバの機能とクライアントの機能を実現したいので、メインスレッド内で、サーバスレッドと、メインスレッド上で動作するクライアント部を作り、サーバとして受信をしつつ、クライアントとして送信を行う事を想定しています。 ここで1つの疑問が生じたのですが、受信と送信でソケットを2つ作るのですが、この2つのソケットに対して、ネットワークインタフェース(Ethernet)のLANの口は1つしかないですが、片方のソケットがネットワークインタフェースを占有してしまい、もう片方のソケットがそのネットワークインタフェースを利用できないというような状況にはならないのでしょうか? サーバとして作ったソケットと、相手のサーバに対して接続要求を行うクライアントのソケットでは、別々のポート番号とIPアドレスを割り振ってあって、スレッドを使用して同時に処理が行われると思っているのですが、ソケットがどのようにネットワークインタフェースに対応しているのかが分かりません。 Ethernetでは、受信と送信の2つの通信路をケーブル内で持っているので、送受を同時に行えるということは分かったのですが、その前の段階でソケットからEthernetに対して同時に送受を行うことができるのかどうかが分かりません。 以上、よろしくお願いします。
回答: nullbotさんの回答と同じことをいってるだけですが・・・ TCP/UDP(トランスポート層)の機能を使うと、トランスポート層より下の階層で実現している機能(小さなパケットの送受信)を使って、一本の通信線を時分割して通信することを前提に「論理的に独立して動ける多数の通信線があるかのように」働きます。 TCPの利用者(プログラム)はパケットを意識する必要がなく、ある長さをもった(無限でもいいですが)データを一本のコネクションを占有してかのように扱えますが、実際のところはトランスポート層が以下のようなことをやってくれていると考えればよいと思います。 * 通信内容をパケットへ分割したりその逆をする * パケットの送受信の順番の乱れ・パケット欠落のための再送をやって元の通信内容と同一になることを保証する(これはTCP) * パケットを時分割で通信することで多数の論理的な通信路に対する並行通信を提供 nullbotさんの回答コメントに > > OSI参照モデルは、各層でデータに対してヘッダを付与していくもの > > > と書かれてますが、ヘッダを付与するのが目的ではなくて上記の制御をするのが目的です。ヘッダの不要はこの目的を達成するための手段と捉えるとよいと思います。