socket() - ソケットの作成

規格

標準/拡張機能 C/C++ 依存項目
XPG4.2

Single UNIX Specification、バージョン 3
both  

Format

X/Open:
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
バークレー・ソケット:
#define _OE_SOCKETS
#include <sys/socket.h>

int socket(int *domain, int type, int protocol);

機能説明

socket() 関数は、通信のエンドポイントを作成し、エンドポイントを表すソケット記述子を戻します。 異なるタイプのソケットで、異なる通信サービスが提供されます。
パラメーター
説明
domain
要求するアドレス・ドメイン。AF_INET、AF_INET6、 AF_UNIX、AF_RAW のいずれかです。
type
作成するソケットのタイプ。SOCK_STREAM、SOCK_DGRAM、または SOCK_RAW のいずれかです。
protocol
要求済みプロトコル。 可能な値は、0、IPPROTO_UDP、または IPPROTO_TCP です。

domain パラメーターによって、通信が行われる 通信ドメインが指定されます。 このパラメーターにより、使用するアドレス・ファミリー (ドメイン内のアドレスの形式) が選択されます。 サポートされるファミリーは、AF_INET および AF_INET6 (インターネット・ドメイン)、および AF_UNIX (ローカル・ソケット・ドメイン) です。 これら の定数は、sys/socket.h 組み込みファイルで定義され ます。

type パラメーターによって、作成済みソケットのタイプ が指定されます。 タイプは、要求済み通信のセマンティクスと類似しています。 これらのソケット・タイプ定数は、sys/socket.h 組み込みファイルで定義されます。 サポートされるパラメーターは以下のとおりです。
ソケット・タイプ
説明
SOCK_DGRAM
その信頼性が保証されていない、固定最大長のコネクションレス・メッセージ であるデータグラムを提供します。 データグラムでは、破壊、順序が狂った受信、紛失、または複数回の 送達が起こる場合があります。 このタイプは、AF_INET、AF_INET6、および AF_UNIX ドメインでサポートされています。
SOCK_RAW
内部プロトコル (IP および ICMP など) のインターフェース を提供します。 このタイプは AF_INET および AF_INET6 ドメインで サポートされています。 このタイプを使用するためには、スーパーユーザーでなければなりません。
SOCK_STREAM
信頼性があり接続指向であるシーケンス化された両方向バイト・ストリームを提供します。 アウト・オブ・バンドのデータのメカニズムがサポートされます。 このタイプは、AF_INET、AF_INET6、および AF_UNIX ドメインでサポートされています。
socket() パラメーターについて: protocol パラメーターによって、ソケットで使用される 特定のプロトコルが指定されます。 ほとんどの場合、単一のプロトコルは、特定のアドレス・ファミリー の特定のソケットのタイプをサポートするために存在します。 protocol パラメーターが 0 に設定された 場合には、要求済みドメインおよびソケット・タイプの デフォルト・プロトコル番号がシステムで選択されます。 プロトコル番号は、tcpip.ETC.PROTO データ・セットで 検出されます。 または、getprotobyname() 呼び出しを使用して、認識 されている名前を付けられたプロトコルのプロトコル番号を取得 できます。
注: domain パラメーターを AF_UNIX に設定する 場合は、protocol フィールドは 0 に 設定する必要があります

SOCK_STREAM ソケット・モデル二重バイト・ストリーム。 ピア・アプリケーション・プログラム間の、信頼性のあるフロー 制御接続を提供します。 ストリーム・ソケットは、動的または受動的です。 アクティブ・ソケットは、 connect()で接続要求を開始するクライアントによって使用されます。 デフォルトでは、 socket() はアクティブなソケットを作成します。 受動的ソケットは、connect() 呼び出しによる接続要求を 受け入れるために、サーバーによって使用されます。 bind() 呼び出しを使用して名前をソケットにバインディングし 、listen() 呼び出しを使用して接続を進んで受け入れる ことを示すことによって、動的ソケットを受動的ソケットに 変換できます。 受動的ソケットの後には、接続要求を開始するためにこれを使用 することはできません。

AF_INET および AF_INET6 ドメインでは、ストリーム・ソケットに適用される bind() 呼び出しによって、アプリケーション・プログラムが、そこから接続要求を進んで受け入れるネットワークを指定することができます。 アプリケーション・プログラムは、 アドレス 構造内の インターネットアドレス フィールドをネットワーク・インターフェースのインターネット・アドレスに設定することによって、ネットワーク・インターフェースを完全に指定することができます。 または、アプリケーション・プログラムでワイルドカード を使用して、任意のネットワークから接続要求を受信する必要がある ことを指定できます。 AF_INET ソケットの場合、これは、 アドレス 構造内の インターネットアドレス フィールドを、 < netinet/in.h>で定義されている定数 INADDR_ANY に設定することによって行います。 AF_INET6 ソケットの場合、これは、アドレス構造内の インターネットアドレス フィールドを、 < netinet/in.h>で定義されている in6addr_any に設定することによって行われます。

ストリーム・ソケット間に接続が確立された後、データ転送呼び出しのいずれかを使用できます。 (read()、 readv() 、 recv()、 recvfrom()、 recvmsg ()、 send()、 sendmsg()、 sendto()、 write() 、および writev())。 通常、 read ()-write() または send()-recv() のペアは、ストリーム・ソケットでデータを送信するために使用されます。 アウト・オブ・バンドのデータが交換される場合には、通常は send()-recv() ペアが使用されます。

SOCK_DGRAM ソケット・モデル・データグラム。 信頼性の保証がない、コネクションレス・メッセージ交換を提供します。 送信済みメッセージのサイズは最大です。 データグラム・ソケットは、AF_UNIX ドメインでサポートされます。

ストリーム・ソケットとデータグラム・ソケットには、動的または 受動的類似性がありません。 サーバーは依然として bind() を呼び出し、ソケット に名前を付け、そこからパケットを受信するネットワーク・インターフェースを指定する必要があります。 ストリーム・ソケットについての説明のように、ワイルドカード のアドレッシングは、データグラム・ソケットにも適用されます。 データグラム・ソケットはコネクションレスなので、listen() 呼び出しは、これらにとっては無意味で、使用する必要もありません。

アプリケーション・プログラムではデータグラム・ソケットが受信 された後、sendto() および recvfrom() 呼び出し、または sendmsg() および recvmsg() 呼び出しを使用して、データグラムを交換できます。 connect() を呼び出し、これを使用してすべての メッセージが交換されるピアの名前を全部指定することによって、アプリケーション・プログラムでステップを 1 つ先に進む場合には、その他のデータ転送呼び出し、read()、write()、readv()、writev()、send()、および recv() も使用できます。 ソケットを接続状態にする方法の詳細については、 connect() - ソケットの接続を参照してください。

データグラム・ソケットによって、メッセージを複数の受信側に ブロードキャストできます。 宛先アドレスをブロードキャスト・アドレスになるように設定することは、ネットワーク・インターフェース依存です (アドレスのクラスおよび subnets (ルーティングを単純化するためにより小さい物理ネットワークに分割 された論理ネットワーク) が使用されるか どうかによって異なります)。 構成済み 1 次ネットワークでブロードキャストがサポートされる 場合には、netinet/in.h で定義された 定数 INADDR_BROADCAST を使用して、1 次ネットワークに ブロードキャストすることができます。

発信パケットには、IP ヘッダーが接頭部として付けられています。 IP オプションは、それぞれ setsockopt() および getsockopt() 呼び出しを使用して、設定および検査ができます。 着信パケットは、IP ヘッダーおよびオプションには影響を与えずに 受信されます。

ソケットは close() 呼び出しを使用して、割り振り解除 されます。
注: AF_UNIX の場合には、結合されたソケットのクローズの際に 、unlink() も使用して、bind() 時に作成 されたファイルを削除する必要があります。

C++の特殊な動作 : To use this function with C++, you must use the _XOPEN_SOURCE_EXTENDED 1 feature test macro.

戻り値

正常に実行された場合、socket() は、負でないソケット記述子を戻します。

正常に実行されなかった場合、socket() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EACCES
指定タイプまたはプロトコルのソケットの作成許可が拒否 されます。
EAFNOSUPPORT
アドレス・ファミリーはサポートされていません (それは AF_UNIX、AF_INET、または AF_INET6 ではありません)。
EAGAIN
リソースは一時的に使用できません。
EINVAL
要求が無効か、またはサポートされていません。
EIO
ネットワークまたはトランスポートで障害が発生しました。
ENOBUFS
使用可能なシステム・リソースが不十分で、呼び出しを完了させることができません。
ENOENT
指定ドメインと一致する NETWORK ステートメントが、parmlib メンバーにありませんでした。
EPROTONOSUPPORT
プロトコルがこのドメインではサポートされないか、または このプロトコルがこのソケット・タイプではサポートされません。
EPROTOTYPE
ソケット・タイプがプロトコルでサポートされません。

socket() 呼び出しの例を以下に示します。
int s;
char *name;
int socket(int domain, int type, int protocol);
⋮
/* Get stream socket in Internet 
domain with default protocol */
s = socket(AF_INET, SOCK_STREAM, 0);
⋮
/* Get stream socket in local socket 
domain with default protocol */
s = socket(AF_UNIX, SOCK_STREAM, 0);

関連情報