int socket(int domain, int type, int protocol);
domain パラメーターは通信を行なうドメインを指定する; これはどの プロトコル・ファミリ(protocol family)を通信に使用するかを指定する。 これらのファミリは <sys/socket.h> に定義されている。 現在、理解できるフォーマットは以下の通り。
名前 | 目的 | マニュアル |
PF_UNIX, PF_LOCAL | ローカル通信 |
unix(7)
|
PF_INET | IPv4 インターネット・プロトコル |
ip(7)
|
PF_INET6 | IPv6 インターネット・プロトコル |
ipv6(7)
|
PF_IPX | IPX - Novell プロトコル | |
PF_NETLINK | カーネル・ユーザ・デバイス |
netlink(7)
|
PF_X25 | ITU-T X.25 / ISO-8208 プロトコル |
x25(7)
|
PF_AX25 | アマチュア無線 AX.25 プロトコル | |
PF_ATMPVC | 生の ATM PVC にアクセスする | |
PF_APPLETALK | アップルトーク |
ddp(7)
|
PF_PACKET | 低レベルのパケットインターフェース |
packet(7)
|
ソケットは type で指定される型を持ち、それは通信方式(semantics)を指定する。 定義されている型は現在以下の通り。
ある種のソケット型が全てのプロトコル・ファミリで実装されているわけではない。 例えば SOCK_SEQPACKET は AF_INET には実装されていない。
protocol はソケットによって使用される固有のプロトコルを指定する。通常それぞれの ソケットは、与えられたプロトコル・ファミリの種類ごとに一つのプロトコルのみを サポートする。 その場合は protocol に 0 を指定できる。 しかし、多くのプロトコルが存在してもかまわない。 この場合にはこの方法により固有のプロトコルを指定する必要がある。 使用されるプロトコル番号は通信の行なわれる``通信ドメイン''に 固有である; protocols(5) を参照すること。 プロトコル名をどうやってプロトコル番号に対応させるかについては getprotoent(3) を参照すること。
SOCK_STREAM 型のソケットはパイプのような全二重バイト・ストリームである。 これらはレコード境界を保存しない。 ストリームは、ソケットがデータを送ったり受けたりする前に 接続された 状態になってなければならない。他のソケットへの接続は connect(2) コールによって行なわれる。一度接続したらデータは read(2) と write(2) コールや send(2) と recv(2) コールの変種を使用して転送できる。 セッションが完了したら close(2) が行なわれる。帯域外データの転送も send(2) に記述されており、 受信も recv(2) に記述されている。
SOCK_STREAM を実装した通信プロトコルはデータに損失や重複がないことを保証する。 もし相手のプロトコルがバッファー空間を持つ データの断片を適当な時間のうちに転送できなければ、 接続は断たれたとみなす。そのソケット SO_KEEPALIVE が有効になっている場合、プロトコル独自の方法で接続の相手側がまだ 有効であるかをチェックする。 もしプロセスが、壊れたストリームでデータを送受信しようとした場合には SIGPIPE シグナルが送られる; これは通常のそのシグナルを扱っていないプロセスを 終了させる。 SOCK_SEQPACKET ソケットは SOCK_STREAM ソケットと同じシステム・コールを使用する。 唯一の違いは read(2) コールが要求された量のデータのみを返し、到着したパケットの残りの部分を 捨ててしまうことである。同様に入ってくるデータグラムの全てのメッセージ境界は 保存される。
SOCK_DGRAM と SOCK_RAW ソケットは sendto(2) コールで指定された相手へデータグラムを送ることが許されている。 データグラムは一般に recvfrom(2) で受けとり、 このコールは次のデータグラムを送信者のアドレスと一緒に返す。
SOCK_PACKET は古いソケット型で、生(raw)のパケットをデバイスドライバから 直接受信するためのものである。 今は代わりに packet(7) を用いること。
fcntl(2) の F_SETOWN 操作を使って、シグナル SIGURG や SIGPIPE を受けとるプロセス・グループを指定できる。 SIGURG シグナルは帯域外データが到着した時に、 SIGPIPE シグナルは SOCK_STREAM 接続が予期せず切断された時に送られる。 また、 F_SETOWN 操作は、I/O や I/O イベントの非同期 (asynchronous) 通知を SIGIO を経由で受け取るプロセスやプロセス・グループを設定するのにも使用できる。 F_SETOWN を使用することは FIOSETOWN または SIOCSPGRP の引き数で ioctl(2) を使用することと等価である。
ネットワークがプロトコル・モジュールにエラー状態を伝えた場合 (例えば、IP の ICMP メッセージを使用して)には、ソケットの ペンディング・エラー・フラグが設定される。次にこのソケットを操作した 時にペンディングされていたエラー・コードが返される。プロトコルによっては エラーについてのより詳しい情報を受け取るためにソケットごとのエラー・キューを 受け取ることが可能である。 ip(7) の IP_RECVERR を参照すること。
ソケットの操作はソケット・レベル options によって制御される。 これらのオプションは <sys/socket.h> に定義されている。 setsockopt(2) と getsockopt(2) 関数はそれぞれオプションの設定と取得を行なう。
下位のプロトコル・モジュールから他のエラーが生成されるかもしれない。
4.x BSD において定数を使用する場合、プロトコル・ファミリーには PF_UNIX, PF_INET 等を使用している。一方でアドレス・ファミリーには AF_UNIX 等が使用されている。しかしながら BSD のマニュアルでは 「一般にプロトコル・ファミリーはアドレス・ファミリーと同じものである。」 と保証している。それでそれ以外の規格では全ての場所で AF_* が使用されている。
lqAn Introductory 4.3BSD Interprocess Communication Tutorialrq は UNIX Programmer's Supplementary Documents Volume 1 として再版された。
lqBSD Interprocess Communication Tutorialrq は UNIX Programmer's Supplementary Documents Volume 1 として再版された。