SOCKET(2)

名称
socket - 通信のエンドポイントの作成

ライブラリ
libc

書式
<sys/types.h> <sys/socket.h> int socket(int domain, int type, int protocol)

解説
socket() システムコールは、通信のエンドポイントを作成し、記述子を戻します。

domain 引数では、通信を行う通信ドメインを指定します。 これにより、使用するプロトコルファミリが選択されます。 このプロトコルファミリは、インクルードファイル <sys/socket.h> で定義されています。 現在解釈されるフォーマットは以下のとおりです:

    PF_LOCAL        PF_UNIX と呼ばれていた、ホスト内プロトコル
    PF_UNIX         ホスト内プロトコル、使用は奨励されない。
                    PF_LOCAL を使用のこと
    PF_INET         IPv4 プロトコル
    PF_PUP          BSP のような PUP プロトコル
    PF_APPLETALK    AppleTalk プロトコル
    PF_ROUTE        内部ルーティングプロトコル
    PF_LINK         リンク層インタフェース
    PF_IPX          Novell 社 IPX (Internet Packet eXchange) プロトコル
    PF_RTIP         RTIP パケットの識別に使用
    PF_PIP          PIP パケットの識別に使用
    PF_ISDN         統合デジタル通信サービス網 (ISDN)
    PF_KEY          内部鍵管理機能
    PF_INET6        IPv6 プロトコル
    PF_NATM         ATM へのネイティブアクセス
    PF_ATM          ATM
    PF_NETGRAPH     Netgraph ソケット

ソケットには、通信の種類を指定する タイプ があります。 現在、定義されているタイプは以下のとおりです:

    SOCK_STREAM     ストリーム型ソケット
    SOCK_DGRAM      データグラム型ソケット
    SOCK_RAW        生プロトコルインタフェース
    SOCK_RDM        伝達が信頼できるパケット
    SOCK_SEQPACKET  順序付きパケットストリーム

SOCK_STREAM タイプは、連続した、信頼性のある、双方向接続ベースの バイトストリームを提供します。 帯域外データ転送メカニズムがサポートされることもあります。 SOCK_DGRAM ソケットでは、データグラム (コネクションレスで信頼性のない、 最大長が固定の (一般的には小さい) メッセージ) がサポートされます。 SOCK_SEQPACKET ソケットは、連続した、信頼性のある、双方向接続ベースの 最大長が固定のデータグラムの転送を提供します。 各読取りシステムコールでパケット全体を読み取る必要があるかもしれません。 この機能はプロトコル固有のもので、現在のところ実装されていません。 SOCK_RAW ソケットでは、内部ネットワークプロトコルとインタフェースにアクセスできます。 スーパユーザしか使用できない SOCK_RAW タイプ、および計画されているがまだ実装されていない SOCK_RDM については、ここでは説明しません。

protocol 引数では、ソケットで使用する特定プロトコルを指定します。 通常の場合は、1 つのプロトコルのみが存在して、 指定したプロトコルファミリの特定ソケットタイプをサポートします。 しかし、複数のプロトコルが存在することも可能です。 この場合は、特定プロトコルをこの方法で指定する必要があります。 使用するプロトコル番号は、通信を行う “通信ドメイン” に固有です。 protocols(5) を参照してください。

タイプ SOCK_STREAM のソケットは、パイプに類似した全二重バイトストリームです。 ストリームソケットでは、 接続済み状態 にしてからデータを送受信する必要があります。 別のソケットへの接続は、 connect(2) システムコールを呼び出して作成できます。 接続されたら、 read(2) と write(2) を呼び出すか、 send(2) と recv(2) 関数の変種を呼び出してデータを転送できます。 (インターネットファミリなど、一部のプロトコルファミリでは、 “暗黙接続” という観念がサポートされています。 この接続では、 sendto(2) システムコールを呼び出し、接続オペレーションに乗せてデータを送信できます。) セッションが終了したら、 close(2) を実行しても構いません。 帯域外データは、 send(2) で説明されているように送信し、 recv(2) で説明されているように受信できます。

SOCK_STREAM の実装に使用する通信プロトコルでは、データの喪失や重複がないことが 保証されます。 ピアプロトコルにバッファ空間があるデータの一部を合理的な時間内に 問題なく転送できない場合は、接続が破損したとみなされて呼び出しが エラーとなり、-1 が戻されてグローバル変数 errno に ETIMEDOUT が設定されます。 その他の動作がない場合、プロトコルは約 1 分ごとに転送を強制し、ソケットの “接続” を任意に維持します。 一定期間 (例えば 5 分間) アイドル接続で応答がない場合はエラーとなります。 破損したストリームでプロセスが送信すると、 SIGPIPE シグナルが発生します。 この場合、シグナルを処理しないプロセスは終了します。

SOCK_SEQPACKET ソケットは、 SOCK_STREAM ソケットとほぼ同じシステムコールです。 read(2) を呼び出しても、要求された量のデータしか戻されず、 受信パケットの残りの部分は放棄される点のみが異なります。

SOCK_DGRAM ソケットと SOCK_RAW ソケットでは、 send(2) の呼び出しで指定された通信相手にデータグラムを送信できます。 一般的にデータグラムは、次のデータグラムのアドレスを戻す recvfrom(2) で受信されます。

fcntl(2) システムコールは、帯域外データを受信した場合の SIGURG シグナルを受信するプロセスグループを指定できます。 非ブロッキング入出力、および入出力イベントの非同期通知も、 SIGIO で有効にできます。

ソケットのオペレーションは、ソケットレベルの オプション で制御されます。 このオプションは、ファイル <sys/socket.h> に定義されています。 setsockopt(2) システムコールはオプションの設定に、 getsockopt(2) システムコールはオプションの入手に使用します。

戻り値
エラーが発生すると -1 が戻されます。 エラーが発生しなかった場合は、ソケットを参照する記述子が戻されます。

エラー
以下のような場合、 socket() システムコールはエラーになります:

[EPROTONOSUPPORT]
    プロトコルタイプか指定されたプロトコルがドメインでサポートされていません。

[EMFILE]
    プロセスごとの記述子テーブルが満杯です。

[ENFILE]
    システムファイルテーブルが満杯です。

[EACCES]
    指定されたタイプやプロトコルのソケットを作成する権限が拒否されました。

[ENOBUFS]
    バッファ空間が不足しています。 充分なリソースが解放されるまでソケットを作成できません。

関連項目
accept(2), bind(2), connect(2), getpeername(2), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2), getprotoent(3), netgraph(4), protocols(5) An Introductory 4.3 BSD Interprocess Communication Tutorial, PS1, 7. BSD Interprocess Communication Tutorial, PS1, 8.

歴史
socket() システムコールは 4.2BSD で登場しました。