接続の確立は、通常、クライアントの役割を果たすプロセスと、サーバーの役割を果たすプロセスによって非同期で行われます。サーバーは、関連付けられた既知のアドレスと、接続要求のためのソケット上のブロックにソケットをバインドします。すると、関連のないプロセスがサーバーに接続できるようになります。クライアントは、サーバーがソケットに対する接続を開始すると、サーバーからサービスを要求します。クライアント側では、connect(3SOCKET) 呼び出しで接続を開始します。インターネットファミリの場合の例を次に示します。
struct sockaddr_in6 server; ... connect(s, (struct sockaddr *)&server, sizeof server);
接続呼び出しの時点でクライアントのソケットがバインドされていない場合、システムは自動的に名前を選択し、ソケットにバインドします。「アドレスのバインド」を参照してください。これは、ローカルアドレスがクライアント側のソケットにバインドされる一般的な方法です。
クライアントの接続を受信するには、サーバーはそのソケットをバインドしたあとに 2 つの処理を行う必要があります。まず、待ち行列に入れることができる接続要求の数を示します。続いて接続を受け入れます。
struct sockaddr_in6 from; ... listen(s, 5); /* 5 つの接続待ち行列を許可する */ fromlen = sizeof(from); newsock = accept(s, (struct sockaddr *) &from, &fromlen);
ソケットハンドル s は、接続要求の送信先であるアドレスにバインドされるソケットです。listen(3SOCKET) の 2 つ目のパラメータは、待ち行列に入れることができる未処理の接続の最大数を指定します。from は、クライアントのアドレスを指定する構造体です。場合によって NULL ポインタが渡されます。fromlen は構造体の長さです (UNIX ファミリでは、from は struct sockaddr_un として宣言される)。
accept(3SOCKET) は一般にブロックします。accept(3SOCKET) は、要求側クライアントに接続されている新しいソケット記述子を返します。fromlen の値は、アドレスの実際のサイズに変更されます。
サーバーは、特定のアドレスからのみ接続を受け入れます。しかしこのことを示すことができません。サーバーは、accept(3SOCKET) が返す from アドレスをチェックし、受け入れ不可能なクライアントとの接続を閉じることができます。サーバーは、複数のソケット上の接続を受け入れることも、あるいは accept 呼び出しのブロックを避けることもできます。これらの手法については、「拡張機能」で説明しています。