SOCKET(2) — UNIX Programmer’s Manual
名称
socket − 通信の出口を作成する
形式
#include <sys/types.h>
#include <sys/socket.h>
s = socket(domain, type, protocol)
int s, domain, type, protocol;
解説
socket は、 通信の終端を作成し、ディスクリプタを返します。
domain パラメタは、 通信が行われる範囲である通信ドメインを指定します。 これは、 使用すべきプロトコルファミリを選択します。 普通、 プロトコルファミリは、 その後そのソケットで実行される各種のオペレーションで使用される アドレスのアドレスファミリと同じです。 これらのファミリは、 インクルードファイル <sys/socket.h> に定義されています。 現在のところ、 認識されるフォーマットは次のとおりです。
PF_UNIX(UNIX内部プロトコル)
PF_INET(ARPAインターネットプロトコル)
PF_NS(ゼロックスネットワークシステムプロトコル)
PF_IMPLINK(IMP“host at IMP”リンクレイヤ)
ソケットは指定された type になります。 typeは通信のセマンティックを意味します。 現在のところ定義されているタイプは、 次のとおりです。
SOCK_STREAM
SOCK_DGRAM
SOCK_RAW
SOCK_SEQPACKET
SOCK_RDM
SOCK_STREAMは、 バイトストリーム(byte streams)を 基にした、 シーケンシャルで信頼性の高い双方向接続を 提供します。 out-of-band のデータ転送メカニズムもサポートすることができます。 SOCK_DGRAMソケットは、 データグラム(datagrams)(無手順で信頼性の低い、 固定最大長(この長さは一般的に短い)のメッセージ)を サポートします。 SOCK_SEQPACKET ソケットは、 固定最大長のデータグラムのための、 シーケンシャルで信頼性の高い双方向接続に基づいたデータ転送パスを 提供することができます。 需要者が、読み出しのシステムコールを出すたびに、1個のパケット全体を 読み取ることが必要なこともあります。 この機能は、プロトコルに固有であり、現在は PF_NS だけで実現されています。 SOCK_RAW (スーパーユーザだけに使用可能)と SOCK_RDM (予定はありますが、 まだ実現されていません)については、 ここではふれません。
protocol は、 そのソケットで使用されるプロトコルを指定します。 通常、 単一のプロトコルが存在して、 与えられたプロトコルファミリ内の個々のソケットタイプを サポートします。 しかし、 複数のプロトコルが存在することも可能であり、 そのような場合も、 個々のプロトコルは、 この方法で指定しなければなりません。 使用するプロトコル番号は、 通信が行われる “通信ドメイン” に特有です (protocols(3N) 参照)。
タイプが SOCK_STREAM であるソケットは、 全二重のバイトストリームで、 パイプに似ています。 このストリームソケットは、 データを送受するためには、 connect された状態になければなりません。 別のソケットへのコネクトは connect(2) コールで確立されます。 ソケットがコネクトされると、 read(2) および write(2) コール、 または send(2) および recv(2) コールのいくつかの異った形でのコールを 使用してデータの転送を行うことができます。 セッションが完了した場合には、 close(2) コールを実行することができます。 また、 out-of-band のデータも、 send(2) で述べられているように送ることができ、 recv(2) で述べられているように受け取ることができます。
SOCK_STREAM を 実現するために使用される通信プロトコルは、 データが失われないことや二重化されないことを保証します。 peer(同位のプロセス)のプロトコルによってバッファスペースが 確保されているデータが一定時間内に転送できない場合には、 コネクトは切断されたものと見なされ、 そのコールは、 エラーを示すリターン値 −1 を返し、 エラーコード ETIMEDOUT を グローバル変数 errno に入れます。 プロトコルは、 他の活動がないときに約 1 分おきに転送を 強制することによって、 随意にソケットを “ウォーム” にしておくことができます。 延長時間(例えば、 5分間)内に応答が得られない場合には、 エラーが示されます。 あるプロセスが切断されているストリームで送信を 行った場合には、 SIG_PIPE シグナルが発せられます。 これはそのシグナルを 処理しないプロセスを 終了させます。
SOCK_SEQPACKET ソケットでは、 SOCK_STREAM ソケットと同じシステムコールが使われます。 唯一の違いは、 read(2) コールが、 要求された量のデータだけを 返すことであり、 到着パケットの残りの部分は捨てられます。
SOCK_DGRAM および SOCK_RAW ソケットを 使用することによって、 send(2) コールで指定した相手へデータグラムを 送ることができます。 データグラムは、 普通、 recvfrom(2) を用いて受信されます。 このコールは、 そのリターンアドレスを 用いて次のデータグラムを 返します。
fcntl(2) コールは、 範囲外データが到着したときに SIGURG シグナルを 受け取るプロセスグループを 指定するために使用することができます。 また、 このコールは、 非ブロッキング入出力と、 SIGIO による入出力イベントの非同期な通知を することもできます。
ソケットの動作は、 ソケットレベル option によって制御されます。 これらのオプションは、 ファイル <sys/socket.h> に定義されています。 setsockopt(2) と getsockopt(2) は、 それぞれオプションのセットと取り出しを 行うために使用されます。
リターン値
エラーが発生した場合には −1 が返され、 そうでない場合には、 リターン値は、 そのソケットを 指すディスクリプタです。
エラー
次の場合には、 socket は失敗します。
[EPROTONOSUPPORT]
そのプロトコルタイプまたは指定されたプロトコルが、 このドメインではサポートされていない。
[EMFILE] プロセス-ディスクリプタテーブルがいっぱいである。
[ENFILE] システムファイルテーブルがいっぱいである。
[EACCESS] 指定されたタイプおよび/またはプロトコルのソケットを 作成するためのパーミッションが否定されている。
[ENOBUFS] バッファスペースが足りない。 ソケットは、 十分なリソースが解放されるまで作成することができない。
関連事項
accept(2), bind(2), connect(2), 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.3BSD Interprocess Communication Tutorial.” (これは、 UNIX Programmer’s Supplementary Documents Volume 1, PS1:7に転載されています。 ) “An Advanced 4.3BSD Interprocess Communication Tutorial.” (これは、 UNIX Programmer’s Supplementary Documents Volume 1, PS1:8に転載されています。 )
NEWS-OSRelease 3.3