socket() - ソケットの作成
規格
| 標準/拡張機能 | C/C++ | 依存項目 |
|---|---|---|
XPG4.2
Single UNIX Specification、バージョン 3 |
both |
Format
#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);機能説明
- パラメーター
- 説明
- 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 組み込みファイルで定義され ます。
- ソケット・タイプ
- 説明
- SOCK_DGRAM
- その信頼性が保証されていない、固定最大長のコネクションレス・メッセージ であるデータグラムを提供します。 データグラムでは、破壊、順序が狂った受信、紛失、または複数回の 送達が起こる場合があります。 このタイプは、AF_INET、AF_INET6、および AF_UNIX ドメインでサポートされています。
- SOCK_RAW
- 内部プロトコル (IP および ICMP など) のインターフェース を提供します。 このタイプは AF_INET および AF_INET6 ドメインで サポートされています。 このタイプを使用するためには、スーパーユーザーでなければなりません。
- SOCK_STREAM
- 信頼性があり接続指向であるシーケンス化された両方向バイト・ストリームを提供します。 アウト・オブ・バンドのデータのメカニズムがサポートされます。 このタイプは、AF_INET、AF_INET6、および AF_UNIX ドメインでサポートされています。
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 ヘッダーおよびオプションには影響を与えずに 受信されます。
C++の特殊な動作 : To use this function with C++, you must use the _XOPEN_SOURCE_EXTENDED 1 feature test macro.
戻り値
正常に実行された場合、socket() は、負でないソケット記述子を戻します。
- エラー・コード
- 説明
- EACCES
- 指定タイプまたはプロトコルのソケットの作成許可が拒否 されます。
- EAFNOSUPPORT
- アドレス・ファミリーはサポートされていません (それは AF_UNIX、AF_INET、または AF_INET6 ではありません)。
- EAGAIN
- リソースは一時的に使用できません。
- EINVAL
- 要求が無効か、またはサポートされていません。
- EIO
- ネットワークまたはトランスポートで障害が発生しました。
- ENOBUFS
- 使用可能なシステム・リソースが不十分で、呼び出しを完了させることができません。
- ENOENT
- 指定ドメインと一致する NETWORK ステートメントが、parmlib メンバーにありませんでした。
- EPROTONOSUPPORT
- プロトコルがこのドメインではサポートされないか、または このプロトコルがこのソケット・タイプではサポートされません。
- EPROTOTYPE
- ソケット・タイプがプロトコルでサポートされません。
例
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);関連情報
- sys/socket.h — ソケット定義
- accept() - ソケットに関する新規接続の受け入れ
- bind() - ソケットへの名前の結合
- close() - ファイルのクローズ
- connect() - ソケットの接続
- fcntl() - オープン・ファイル記述子の制御
- getprotobyname() - 名前によるプロトコル・エントリーの取得
- getsockname() - ソケット名の取得
- getsockopt() - ソケットに関連したオプションの取得
- ioctl() - 装置の制御
- read() - ファイルまたはソケットからの読み取り
- readv() - ファイルまたはソケットのデータの読み取りとバッファー・セットへの保管
- recv() - ソケット上のデータの受信
- recvfrom() - ソケット上のメッセージの受信
- recvmsg() - ソケット上のメッセージの受信およびメッセージ・ヘッダーの配列への保管
- select()、pselect() - ファイルまたはソケットおよびメッセージ・キューに関するアクティビティーのモニター
- selectex() - ファイルまたはソケットおよびメッセージ・キューに関するアクティビティーのモニター
- send() - ソケットに関するデータの送信
- sendmsg() - ソケットに関するメッセージの送信
- shutdown() - 二重接続の全部または一部のシャットダウン
- write() - ファイルまたはソケットへのデータの書き込み
- writev() - 配列からファイルまたはソケットへのデータの書き込み