から [〜#〜] apue [〜#〜] :
17.3一意の接続
サーバーは、標準の
bind
、listen
、およびaccept
関数。クライアントはconnect
を使用してサーバーに接続します。接続要求がサーバーによって受け入れられた後、クライアントとサーバーの間に一意の接続が存在します。この操作スタイルは、図16.16および16.17でインターネットドメインソケットを使用して示したものと同じです。
私が正しければ、 2つのインターネットドメインTCPソケット の間には最大で1つの接続があります。
2つのUnixドメインソケット間にはいくつの接続がありますか?
最大でも1つしか存在しない場合、なぜこの本は2つのUNIXドメインソケット間の接続を一意にするためのセクションを用意しているのですか?
ありがとう。
私はそのトピックに関するSteffen Ullrichの表現が好きだとは思いません。ソケットは、多くの非常に異なるプロトコル(注1を参照)に使用できる汎用インターフェースであるため、当然複雑です。
異なるプロトコル間で一般化するために、ソケットインターフェイスは異なるプロトコルの共通機能を識別します。
SOCK_STREAMプロトコルは、通常、SOCK_DGRAMプロトコルとは大きく異なります。しかし、これらの各グループ内では、プロトコルにそれほど違いはありません。
接続指向プロトコルは常に(?)single接続でそれらの間でデータが送信されるソケットのペアです。接続プロトコルは通常、何らかの形式の「リスニング」ソケットもサポートします。このソケットの唯一の目的は、新しい接続要求を待つことです。
接続指向のソケットは、間に回線がある2つの電話と考えてください。
connect()
およびaccept()
を呼び出すと、2つのバインドされたソケット(接続の各側に1つ)を持つ新しい接続が作成されます。
データグラム指向のプロトコルは非常に異なります。ソケットは、メールボックスのように機能し、どこからでもメッセージを受信するように構成できます。接続する必要はありません。 UDPの場合、送信されたすべてのパケットto正しいIPとポートfrom任意のIPとポートが同じソケットによって取得されます。そのため、同じソケットを介して複数の異なるコンピューターと会話を行うことができます。
SOCK_DGRAMソケットの connect()
には特別な意味があります。
ソケットsockfdのタイプがSOCK_DGRAMの場合、addrはデフォルトでデータグラムが送信されるアドレスであり、データグラムが受信される唯一のアドレスです。
これは新しい一意の接続を作成しません。これは、このメッセージが受信するメッセージを制限するだけで、反対側のソケットは制限しません。
sendto()
関数を使用すると、プログラムはメッセージを送信し、送信するアドレスを指定できます。
これらは、インターネットソケット(TCPおよびUDP)と同様に、両方の種類(SOCK_STREAMおよびSOCK_DGRAM)で提供されます。したがって、SOCK_STREAM unixソケットの場合、はい、ソケットのペア間に1つの接続しかありません。ただし、SOCK_DGRAM unixソケットは異なります(UDPがTCPと異なるのと同じように)。
注1:Unixソケットはファンキーです。これは、基礎となるプロトコルが存在しないため、カーネルの構成要素であるためです。カーネルは、アドレスメカニズムとして独自のソケットiノードを自由に使用できます。 mosvyが指摘しているように、UNIXソケットのアドレスを決定しようとすると、これは奇妙な動作につながる可能性があります。