~からアプエ:
17.3 一意の接続
サーバーが準備できる一意のUNIXドメイン接続標準、機能を活用して顧客に情報を
bind
提供します。クライアントはサーバーに接続するために使用されます。サーバーが接続要求を受け入れると、クライアントとサーバーの間に一意の接続が存在します。これは私たちが説明したのと同じ方法で動作しますlisten
accept
connect
インターネットドメインソケット図 16.16 と 16.17 に示します。
私が正しいなら、 2つのインターネットドメインTCPソケット間に最大1つの接続があります。。
2つのUnixドメインソケット間にいくつの接続がありますか?
最大1つしかない場合、なぜこの本では、2つのUNIXドメインソケット間の接続を一意にするためにセクションを使用するのですか?
ありがとうございます。
答え1
私はこのトピックについてSteffen Ullrichの言葉が好きかどうかわかりません。ソケットは非常に多様なプロトコルで使用できる一般的なインタフェースであるため、本質的に複雑です(注1参照)。
さまざまなプロトコルを要約すると、ソケットインタフェースはさまざまなプロトコルの共通の特性を識別します。
- すべてのプロトコルには一種のアドレッシングメカニズムが必要です。 (注1参照)
- すべてのデータはあるアドレスから別のアドレスに転送されます。
- ここでは、2種類のプロトコルを議論するのが便利です。
- いくつかのプロトコルは接続を表します:SOCK_STREAM
- いくつかのプロトコルは一連のメッセージを表します:SOCK_DGRAM
SOCK_STREAM プロトコルは通常 SOCK_DGRAM プロトコルとは大きく異なります。しかし、各グループ内では合意に大きな差はなかった。
SOCK_STREAM
- 例: TCP
- データは中断することなく長いストリームで到着します。
- データは常に送信された順序で到着します。
接続指向プロトコルは常に(?)一対のソケットであり、2つのソケット間でデータが渡されます。一つつながる。接続プロトコルは通常、新しい接続要求を待つことが唯一の目的である「受信」ソケットの形式をサポートします。
接続指向のソケットを2つの電話機の間に線があると考えてください。
呼び出されると、connect()
2accept()
つのバインドされたソケット(接続の両側に1つ)を使用して新しい接続が作成されます。
SOCK_DGRAM
- UDPの例
- データは連続ストリームに混在せず、送信されたものと同じチャンク(メッセージ)で到着します。
- メッセージが順番に届かない場合があります。
データグラム指向プロトコルはかなり異なります。ソケットはメールボックスと同様に構成し、どこからでもメッセージを受け取ることができます。接続する必要はありません。 UDP の場合、すべてのパケットが送信されます。到着正しいIPとポート~からすべてのIPとポートは同じソケットで取得されます。したがって、同じソケットを介して複数の異なるコンピュータと通信できます。
特別な意味があります。connect()
SOCK_DGRAMソケットから。
ソケット sockfd が SOCK_DGRAM タイプの場合、addr はデータグラムを送信するベースアドレスであり、データグラムを受け取る唯一のアドレスです。
これは新しい一意の接続を作成しません。これは、他のソケットではなくソケットが受信するメッセージを制限するだけです。
このsendto()
機能により、プログラムがメッセージを送受信するアドレスを指定できます。
Unixドメインソケット
インターネットソケット(TCPとUDP)と同様に、2つの形式(SOCK_STREAMとSOCK_DGRAM)があります。したがって、SOCK_STREAM Unixソケットの場合、ソケットペア間に接続が1つしかありません。ただし、SOCK_DGRAM Unixソケットは異なります(UDPがTCPとは異なります)。
注1:Unixソケットはデフォルトのプロトコルがなく、カーネル構成なので流行しています。カーネルはアドレッシングメカニズムとして独自のソケットinodeを自由に使用できます。 mosvyが指摘したように、これはUnixソケットのアドレスを確認しようとすると奇妙な動作を引き起こす可能性があります。
答え2
- 最大1個です。
- ソケットファイルとfifoファイルの使い方を区別します。書き込み用に名前付きfifoを開くと、読者への一意の接続は作成されません。 (あるいはその逆も)。つまり、これはセクション15.5「FIFO」と対照するために行われます。