SOCKET(2)

名前
socket - 通信のための端点(endpoint)を作成する

書式
#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

書式
socket は通信のための端点(endpoint)を作成しディスクリプター(descriptor)を返す。 domain パラメーターは通信を行なうドメイン(domain)を指定する; これはどの プロトコル・ファミリ(protocol family)を使用するかを指定する。 これらのファミリは sys/socket.h インクルード・ファイルに定義されている。 現在、理解できるフォーマットは

    AF_UNIX
        (UNIX 内部プロトコル)

    AF_INET
        (ARPA インターネット・プロトコル)

    AF_ISO
        (ISO プロトコル)

    AF_NS
        (Xerox ネットワーク・システム・プロトコル)

    AF_IMPLINK
        (IMP “host at IMP” リンク層)
ソッケトは type で指定される型を持ち、それは通信の方式(semantics)を指定する。 現在、定義されている型は:
    SOCK_STREAM
    SOCK_DGRAM
    SOCK_RAW
    SOCK_SEQPACKET
    SOCK_RDM
SOCK_STREAM 型はバイト・ストリーム(byte stream)に基づいた、順序性、信頼性のある二点間接続に よる通信を提供する。帯域外(out-of-band)データ転送メカニズムも サポートされる。 SOCK_DGRAM ソケットはデータグラム(datagram)(接続無し、信頼性無し、(典型的に 小さな)固定最大長メッセージ) SOCK_SEQPACKET ソケットは固定最大長のデータグラム転送パスに基づいた順序性、信頼性のある 二点間接続による通信を提供する。受け取り側は完全なパケット(packet)を それぞれの read システム・コールを用いて読み取ることを要求される。 この性質はプロトコル特有であり、現在のところ AF_NS のためだけに実装されている。 SOCK_RAW は内部ネットワーク・プロトコルやインターフェーズ(interface)へのアクセスを 提供する。 SOCK_RAW はスーパー・ユーザーのみが可能である、 SOCK_RDM, は計画されているもののまだ実装されていないでここには記述しない。 protocol はソケットによって使用される固有のプロトコルを指定する。通常はそれぞれの ソケットは与えられたプロトコル・ファミリの種類ごとに一つのプロトコル のみをサポートする。しかし、多くのプロトコルが存在してもかまわない。 この場合にはこの方法により固有のプロトコルを指定する必要がある。 使用されるプロトコル番号は通信の行なわれる“通信ドメイン”に 固有である; protocols(5) を参照すること。 SOCK_STREAM 型のソケットはパイプ(pipe)のような全二重バイト・ストリームである。 ストリームはソケットはデータを送ったり受けたりする前に 接続 状態になってなければならない。他のソケットへの接続は connect(2) コールによって行なわれる。一度接続したらデータは read(2) と write(2) コールや send(2) と recv(2) コールの変種を使用して転送できる。 セッション(session)が完了したら close(2) が行なわれる。帯域外データの転送も send(2) に記述されており、 受信も recv(2) に記述されている。 SOCK_STREAM の実装に使用された通信プロトコルはデータに損失や重複が ないことを保証する。もし相手のプロトコルがバッファー空間を持つ データの断片を適当な時間のうちに転送できなければ、接続は 断たれたとして判断して、コールは -1 を返してエラーを示し、 errno グローバル変数に ETIMEDOUT を設定する。 このプロトコルはオプションで 他の通信がない場合には約１分ごとに強制的に転送を行ないソケットを 暖かく(warm) 保つことができる。 もし休止した接続の相手から拡張された期間(例えば5分)の間応答が引き出せ なかった場合にはエラーが示される。 もしプロセスが壊れたストリームにデータを送った場合は SIGPIPE シグナルが送られる; これは通常のそのシグナルを扱っていないプロセス を終了させる。 SOCK_SEQPACKET ソケットは SOCK_STREAM ソケットと同じシステム・コールを使用する。 唯一の違いは read(2) コールが要求された量のデータのみを返し、到着したパケットの残りの部分を 捨ててしまうことである。 SOCK_DGRAM と SOCK_RAW ソケットは send(2) コールで指定された相手へデータグラムを送ることが許されている。 データグラムは一般に recvfrom(2) で受けとる、 それは返りアドレスとして次のデータグラムを返す。 fcntl(2) コールはバンド外データを受けとった時に SIGURG シグナルを受けとるプロセス・グループを指定するのに使用できる。 また非停止(non-blocking) I/O や SIGIO を通した I/O イベントの非同期(asynchronous)通知を可能にする。 ソケットの操作はソケット・レベルの オプション(options) によって制御される。 これらのオプションは sys/socket.h ファイルに定義されている。 setsockopt(2) と getsockopt(2) はそれぞれオプションの設定と取得を行なう。

返り値
エラーが発生した場合は -1 を返す、それ以外は返り値は ソケットを参照するディスクリプターである。

エラー

EPROTONOSUPPORT
    このドメインでは指定されたプロトコルまたはプロトコル・タイプ(type)が サポートされていない。

EMFILE
    プロセスあたりのディスクリプター・テーブルに空きがない。

ENFILE
    システム・ファイル・テーブルに空きがない。

EACCES
    指定されたタイプまたはプロトコルのソケットを作成する許可が与えられていない。

ENOBUFS
    十分なバッファー空間が使用できない。十分な資源が解放されるまではソケットを 作成することはできない。

準拠
4.4BSD ( socket 関数は 4.2BSD で現われた。) 一般に(System V の変種を含めて) BSD のソケット層のクローンをサポートしている BSD 以外のシステムへ、 または、BSD 以外のシステムからの移植ができる。

関連項目
accept(2), bind(2), connect(2), getprotoent(3), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2)

"An Introductory 4.3 BSD Interprocess Communication Tutorial" は UNIX Programmer's Supplementary Documents Volume 1 として再版された。

"BSD Interprocess Communication Tutorial" は UNIX Programmer's Supplementary Documents Volume 1 として再版された。