82

TCP には、あるクライアントを別のクライアントに伝えるためのタプル ペア (IP アドレス/ポート/タイプ) があります。UDP はクライアント IP とポートを渡します。UNIX ドメインはどのようにしてさまざまなクライアントを追跡しますか?

つまり、サーバーは /tmp/socket などのパスにバインドされたソケットを作成します。2 つ以上のクライアントが /tmp/socket に接続します。client1 と client2 からのデータを追跡するために何が行われているのでしょうか? ネットワーク スタックはドメイン ソケットでは何の役割も果たさないと思いますが、カーネルがここですべての作業を行っているのでしょうか?

IP プロトコル形式や TCP/UDP 形式のような UNIX ドメイン プロトコル形式はありますか? ドメイン ソケット データグラム プロトコルの形式はどこかで公開されていますか? すべての UNIX は異なるのですか、それとも POSIX のようなものが標準化していますか?

イルミネーションをありがとう。これを説明する情報は見つかりませんでした。すべての情報源は、ドメイン ソケットの使用方法について説明しているだけです。

4

1 に答える 1

113

PF_UNIXタイプのソケットを作成し、そのソケットでSOCK_STREAM接続を受け入れる場合、接続を受け入れるたびに、新しいファイル記述子を (acceptシステム コールの戻り値として) 取得します。このファイル記述子は、クライアント プロセス内のファイル記述子からデータを読み取り、ファイル記述子にデータを書き込みます。したがって、TCP/IP 接続と同じように機能します。

「UNIX ドメイン プロトコル形式」はありません。Unix ドメイン ソケットはネットワーク接続を介してピアに接続できないため、その必要はありません。カーネルでは、Unix ドメイン ソケットの終端を表すSOCK_STREAMファイル記述子は、接続の反対側にあるファイル記述子をカーネルに伝えるデータ構造を指します。ファイル記述子にデータを書き込むと、カーネルは接続の反対側でファイル記述子を検索し、そのデータをその他のファイル記述子の読み取りバッファーに追加します。カーネルは、宛先を説明するヘッダーを含むパケット内にデータを入れる必要はありません。

SOCK_DGRAMソケットの場合、データを受信するソケットのパスをカーネルに伝える必要があり、それを使用して受信ソケットのファイル記述子を検索します。

サーバー ソケットに接続する前 (または を使用している場合はデータを送信する前SOCK_DGRAM) にクライアント ソケットにパスをバインドすると、サーバー プロセスはgetpeername(for SOCK_STREAM) を使用してそのパスを取得できます。の場合SOCK_DGRAM、受信側recvfromは送信ソケットのパスを取得するために使用できます。

パスをバインドしない場合、受信プロセスはピアを一意に識別する ID を取得できません。少なくとも、私が実行している Linux カーネルではそうではありません ( 2.6.18-238.19.1.el5)。

于 2012-03-10T06:42:45.793 に答える