web-dev-qa-db-ja.com

2つのUnixドメインソケット間にはいくつの接続がありますか?

から [〜#〜] apue [〜#〜]

17.3一意の接続

サーバーは、標準のbindlisten、およびaccept関数。クライアントはconnectを使用してサーバーに接続します。接続要求がサーバーによって受け入れられた後、クライアントとサーバーの間に一意の接続が存在します。この操作スタイルは、図16.16および16.17でインターネットドメインソケットを使用して示したものと同じです。

私が正しければ、 2つのインターネットドメインTCPソケット の間には最大で1つの接続があります。

2つのUnixドメインソケット間にはいくつの接続がありますか?

最大でも1つしか存在しない場合、なぜこの本は2つのUNIXドメインソケット間の接続を一意にするためのセクションを用意しているのですか?

ありがとう。

2
Tim

私はそのトピックに関するSteffen Ullrichの表現が好きだとは思いません。ソケットは、多くの非常に異なるプロトコル(注1を参照)に使用できる汎用インターフェースであるため、当然複雑です。

異なるプロトコル間で一般化するために、ソケットインターフェイスは異なるプロトコルの共通機能を識別します。

  • すべてのプロトコルには、何らかのアドレスメカニズムが必要です。 (注1を参照
  • すべてのデータは、アドレスからアドレスに送信されます。
  • ここで説明するには、次の2種類のプロトコルが役立ちます。
    • 一部のプロトコルは接続を表します:SOCK_STREAM
    • 一部のプロトコルは一連のメッセージを表します:SOCK_DGRAM

SOCK_STREAMプロトコルは、通常、SOCK_DGRAMプロトコルとは大きく異なります。しかし、これらの各グループ内では、プロトコルにそれほど違いはありません。

SOCK_STREAM

  • 例:TCP
  • データは途切れることなく長いストリームで到着します。
  • データは常に送信された順序で到着します

接続指向プロトコルは常に(?)single接続でそれらの間でデータが送信されるソケットのペアです。接続プロトコルは通常、何らかの形式の「リスニング」ソケットもサポートします。このソケットの唯一の目的は、新しい接続要求を待つことです。

接続指向のソケットは、間に回線がある2つの電話と考えてください。

connect()およびaccept()を呼び出すと、2つのバインドされたソケット(接続の各側に1つ)を持つ新しい接続が作成されます。

SOCK_DGRAM

  • UDPの例
  • データは、送信されたのと同じブロック(メッセージ)で到着し、連続ストリームにマッシュされません。
  • メッセージが順番に届かない場合があります。

データグラム指向のプロトコルは非常に異なります。ソケットは、メールボックスのように機能し、どこからでもメッセージを受信するように構成できます。接続する必要はありません。 UDPの場合、送信されたすべてのパケットto正しいIPとポートfrom任意のIPとポートが同じソケットによって取得されます。そのため、同じソケットを介して複数の異なるコンピューターと会話を行うことができます。

SOCK_DGRAMソケットの connect() には特別な意味があります。

ソケットsockfdのタイプがSOCK_DGRAMの場合、addrはデフォルトでデータグラムが送信されるアドレスであり、データグラムが受信される唯一のアドレスです。

これは新しい一意の接続を作成しません。これは、このメッセージが受信するメッセージを制限するだけで、反対側のソケットは制限しません。

sendto()関数を使用すると、プログラムはメッセージを送信し、送信するアドレスを指定できます。

Unixドメインソケット

これらは、インターネットソケット(TCPおよびUDP)と同様に、両方の種類(SOCK_STREAMおよびSOCK_DGRAM)で提供されます。したがって、SOCK_STREAM unixソケットの場合、はい、ソケットのペア間に1つの接続しかありません。ただし、SOCK_DGRAM unixソケットは異なります(UDPがTCPと異なるのと同じように)。


注1:Unixソケットはファンキーです。これは、基礎となるプロトコルが存在しないため、カーネルの構成要素であるためです。カーネルは、アドレスメカニズムとして独自のソケットiノードを自由に使用できます。 mosvyが指摘しているように、UNIXソケットのアドレスを決定しようとすると、これは奇妙な動作につながる可能性があります。

5
Philip Couling
  1. 最大で1つ。
  2. ソケットファイルとfifoファイルの使用方法を区別するため。名前付きFIFOを書き込み用に開いても、リーダーとの一意の接続は作成されません。 (またはその逆)。言い換えると、これはセクション15.5のFIFOとは対照的に行われます。
1
sourcejedi