socket() - ソケットの作成
標準
標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
XPG4.2 |
両方 |
形式
#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() 呼び出しによって、アプリケーション・プログラムが、そこから接続要求を進んで受け入れるネットワークを指定することができます。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 ヘッダーおよびオプションには影響を与えずに 受信されます。
C++ の特殊な動作: この関数を C++ で使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを使用する必要があります。
戻り値
正常に実行された場合、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() - 配列からファイルまたはソケットへのデータの書き込み