socket() - ソケットの作成

標準

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

XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

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

ストリーム・ソケット間での接続の明確化の後では、次のような データ転送呼び出しのどれでも使用することができます (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++ の特殊な動作: C++ でこの関数を使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを 使用する必要があります。

戻り値

正常に実行された場合、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);

関連情報