質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

3933閲覧

ソケット通信におけるネットワークインタフェース

popoNEKO

総合スコア11

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2017/04/28 03:54

C++で2台のPC間でTCP通信を用いたソケット通信を行うプログラムを作っています。
現在は設計の段階です。
1つのプロセスの中で、サーバの機能とクライアントの機能を実現したいので、メインスレッド内で、サーバスレッドと、メインスレッド上で動作するクライアント部を作り、サーバとして受信をしつつ、クライアントとして送信を行う事を想定しています。

ここで1つの疑問が生じたのですが、受信と送信でソケットを2つ作るのですが、この2つのソケットに対して、ネットワークインタフェース(Ethernet)のLANの口は1つしかないですが、片方のソケットがネットワークインタフェースを占有してしまい、もう片方のソケットがそのネットワークインタフェースを利用できないというような状況にはならないのでしょうか?
サーバとして作ったソケットと、相手のサーバに対して接続要求を行うクライアントのソケットでは、別々のポート番号とIPアドレスを割り振ってあって、スレッドを使用して同時に処理が行われると思っているのですが、ソケットがどのようにネットワークインタフェースに対応しているのかが分かりません。
Ethernetでは、受信と送信の2つの通信路をケーブル内で持っているので、送受を同時に行えるということは分かったのですが、その前の段階でソケットからEthernetに対して同時に送受を行うことができるのかどうかが分かりません。

以上、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

nullbotさんの回答と同じことをいってるだけですが・・・

TCP/UDP(トランスポート層)の機能を使うと、トランスポート層より下の階層で実現している機能(小さなパケットの送受信)を使って、一本の通信線を時分割して通信することを前提に「論理的に独立して動ける多数の通信線があるかのように」働きます。

TCPの利用者(プログラム)はパケットを意識する必要がなく、ある長さをもった(無限でもいいですが)データを一本のコネクションを占有してかのように扱えますが、実際のところはトランスポート層が以下のようなことをやってくれていると考えればよいと思います。

  • 通信内容をパケットへ分割したりその逆をする
  • パケットの送受信の順番の乱れ・パケット欠落のための再送をやって元の通信内容と同一になることを保証する(これはTCP)
  • パケットを時分割で通信することで多数の論理的な通信路に対する並行通信を提供

nullbotさんの回答コメントに

OSI参照モデルは、各層でデータに対してヘッダを付与していくもの

と書かれてますが、ヘッダを付与するのが目的ではなくて上記の制御をするのが目的です。ヘッダの不要はこの目的を達成するための手段と捉えるとよいと思います。

投稿2017/04/28 23:15

編集2017/04/28 23:18
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ソケットはTCP/IPを使うためのインターフェースであって直接Ethernetに対してなにかしているわけではありません。バッファを読み書きしているだけです。

OSI参照モデルはご存知でしょうか?
それぞれの層でデータの単位が異なっており、アプリケーションで連続して送受信しているように見えても、下の層では細切れになっています。逆に言うと細切れになったデータを抜けがないように順序を揃えるのがTCP/IPの役目です。

投稿2017/04/28 06:22

nullbot

総合スコア910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popoNEKO

2017/04/28 22:19

ありがとうございます。 OSI参照モデルは、各層でデータに対してヘッダを付与していくものというくらいの認識でした。 細切れになっているというのは、どういう意味か、調べます。 伝わりにくいと思うのですが、片方のPC(A)が連続して、無限にデータをもう一方のPC(B)に送り続けていた場合、BはAの送信終了を待機し続ける状態になるのではないか?その場合の事も考慮して設計を進めなければならないのか、という事です。
episteme

2017/04/29 01:45

Aからのメッセージをもらった後でないとBがなにも送れないような設計・実装なら、当然そうなりますわな。
guest

0

大丈夫です。Ethernetポート一つでも問題なく出来ます。

投稿2017/04/28 06:02

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問