Unix domain Socket

1246 ワード

Unixドメインsocketは、異なるホストのクライアントとサーバ間の通信に使用されるソケットではなく、実際には単一のホスト上でクライアント/サーバを実行する通信方法であり、プロセス間IPCと言える.
 
しかし、通常の通信ソケットとは少し違います.
まず使用するソケットアドレスが違います
Unix domain socketはsockaddr_を使用していますun、sockaddrではなくin.
sockaddr_un構造は以下の通りである.
struct sockaddr_un
{
  sa_family_t sun_family;               /*PF_UNIX AF_UNIX */
  char sun_path[UNIX_PATH_MAX];       /*     */
};

この構造体は、双方向パイプに似たプロセス間の通信を実現するための具体的なファイルを指定します.
 
もう1つは、通常のUDP通信とは異なる点です.クライアントがサーバに情報を送信するにはbind関数を呼び出さなければなりません.そうしないと、サーバはrecvfrom関数でクライアントのsockaddr_を取得できません.unの.これは当然のことか!!クライアントは明確なパスを指定していないので、サーバはお客様のアドレスを特定できないに違いありません.
 
でも!しかし、一般的な通信udp socketでは、クライアントがipとポートアドレスをバインドしなければ、サーバは対端接続のクライアントの通信アドレスを得ることができる.これはクライアントがsockaddrをバインドしていないためです.Inアドレスですが、linuxカーネルはudpにメッセージ送信インタフェースのipを自動的に埋め込み、使用可能なポートを自動的に選択します.これによりudpメッセージが構築される.
 
通常、サービス側はipとポートをバインドしますが、bindがなくてもエラーはありません.カーネルも自動選択されるため、サーバポート番号はランダムであり、サーバポート自体は本来よく知られている.これによりクライアントが通信できるようになり、サーバポートがランダムであれば、クライアントもサービス側のポート番号を特定できず、通信できなくなる.
 
Unix domain socketはbind関数でsocketファイルを作成し、bind関数を呼び出す前に指定した同名のsocketファイルがすでに存在するとbindに失敗するため、bindチェックではunlink関数を使用してsocketファイルを削除することが望ましい.
詳細については、次を参照してください.
unp 15c