socket

Autres langues

Langue: ja

Version: 2004-06-17 (fedora - 25/11/07)

Autres sections - même nom

Section: 2 (Appels système)

名前

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

書式

#include <sys/types.h> /* 「注意」参照 */
#include <sys/socket.h>

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

説明

socket() は通信のための端点(endpoint)を作成し、ディスクリプター(descriptor)を返す。

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_STREAM
順序性と信頼性があり、双方向の、接続された バイト・ストリーム(byte stream)を提供する。 帯域外(out-of-band)データ転送メカニズムもサポートされる。
SOCK_DGRAM
データグラム(接続、信頼性無し、固定最大長メッセージ) をサポートする。
SOCK_SEQPACKET
固定最大長のデータグラム転送パスに基づいた順序性、信頼性のある 双方向の接続に基づいた通信を提供する。受け取り側はそれぞれの読み出し システム・コールごとにパケット全体を読み取ることを要求される。
SOCK_RAW
生のネットワーク・プロトコルへのアクセスを提供する。
SOCK_RDM
信頼性はあるが、順序は保証しないデータグラム層を提供する。
SOCK_PACKET
廃止されており新しいプログラムで使用してはいけない。 を参照すること

ある種のソケット型が全てのプロトコル・ファミリで実装されているわけではない。 例えば SOCK_SEQPACKETAF_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_DGRAMSOCK_RAW ソケットは sendto(2) コールで指定された相手へデータグラムを送ることが許されている。 データグラムは一般に recvfrom(2) で受けとり、 このコールは次のデータグラムを送信者のアドレスと一緒に返す。

SOCK_PACKET は古いソケット型で、生(raw)のパケットをデバイスドライバから 直接受信するためのものである。 今は代わりに packet(7) を用いること。

fcntl(2) の F_SETOWN 操作を使って、シグナル SIGURGSIGPIPE を受けとるプロセス・グループを指定できる。 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) 関数はそれぞれオプションの設定と取得を行なう。

返り値

成功した場合、新しいソケットのファイル・ディスクリプターを返す。 エラーが発生した場合は -1 を返し、 errno を適切に設定する。

エラー

EACCES
指定されたタイプまたはプロトコルのソケットを作成する許可が与えられていない。
EAFNOSUPPORT
指定されたアドレスファミリーがサポートされていない。
EINVAL
知らないプロトコル、または利用できないプロトコル・ファミリである。
EMFILE
プロセスのファイルテーブルが溢れている。
ENFILE
カーネルに新しいソケット構造体に割り当てるための十分なメモリがない。
ENOBUFS または ENOMEM
十分なメモリがない。十分な資源が解放されるまではソケットを 作成することはできない。
EPROTONOSUPPORT
このドメインでは指定されたプロトコルまたはプロトコル・タイプが サポートされていない。

下位のプロトコル・モジュールから他のエラーが生成されるかもしれない。

準拠

4.4BSD, POSIX.1-2001. socket() は 4.2BSD で登場した。一般に、(System V の変種を含めて) BSD のソケット層の互換性をサポートしている BSD 以外のシステムへの、 または、BSD 以外のシステムからの移植ができる。

注意

POSIX.1-2001 では <sys/types.h> のインクルードは必須とされておらず、 Linux ではこのヘッダファイルは必要ではない。 しかし、歴史的には、いくつかの実装 (BSD 系) でこのヘッダファイルが 必要であり、移植性が必要なアプリケーションではこのファイルを インクルードするのが賢明であろう。

4.x BSD において定数を使用する場合、プロトコル・ファミリーには PF_UNIX, PF_INET 等を使用している。一方でアドレス・ファミリーには AF_UNIX 等が使用されている。しかしながら BSD のマニュアルでは 「一般にプロトコル・ファミリーはアドレス・ファミリーと同じものである。」 と保証している。それでそれ以外の規格では全ての場所で AF_* が使用されている。

バグ

SOCK_UUCP はまだ実装されていない。

socket() の利用例が getaddrinfo(3) に記載されている。

関連項目

accept(2), bind(2), connect(2), fcntl(2), getpeername(2), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), getprotoent(3), ip(7), socket(7), tcp(7), udp(7), unix(7)

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

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