標準/拡張機能 | 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 (ローカル・ソケット・ドメイン) です。これら の定数は、sys/socket.h 組み込みファイルで定義され ます。
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() は、負でないソケット記述子を戻します。
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);