SOCKET(2) | Linux Programmer's Manual | SOCKET(2) |
socket - 通信のための端点 (endpoint) を作成する
#include <sys/types.h> /*
「注意」参照 */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
socket() creates an endpoint for communication and returns a file descriptor that refers to that endpoint. The file descriptor returned by a successful call will be the lowest-numbered file descriptor not currently open for the process.
domain 引数は通信を行なうドメインを指定する; これはどの プロトコルファミリー (protocol family) を通信に使用するかを指定する。 これらのファミリーは <sys/socket.h> に定義されている。現在カーネルが理解できるフォーマットは以下の通り。
名前 | 目的 | マニュアル |
AF_UNIX | ローカル通信 | unix(7) |
AF_LOCAL | Synonym for AF_UNIX | |
AF_INET | IPv4 インターネットプロトコル | ip(7) |
AF_AX25 | アマチュア無線 AX.25 プロトコル | . ax25(4) |
AF_IPX | IPX - Novell プロトコル | |
AF_APPLETALK | AppleTalk | ddp(7) |
AF_X25 | ITU-T X.25 / ISO-8208 プロトコル | x25(7) |
AF_INET6 | IPv6 インターネットプロトコル | ipv6(7) |
AF_DECnet | DECet protocol sockets | |
AF_KEY | Key management protocol, originally developed for usage with IPsec | |
AF_NETLINK | カーネルユーザーインターフェースデバイス | netlink(7) |
AF_PACKET | 低レベルのパケットインターフェース | packet(7) |
AF_RDS | . Reliable Datagram Sockets (RDS) protocol | . . rds(7) rds-rdma(7) |
AF_PPPOX | Generic PPP transport layer, for setting up L2 tunnels (L2TP and PPPoE) | |
AF_LLC | . Logical link control (IEEE 802.2 LLC) protocol | |
AF_IB | . InfiniBand native addressing | |
AF_MPLS | . Multiprotocol Label Switching | |
AF_CAN | . Controller Area Network automotive bus protocol | |
AF_TIPC | . TIPC, "cluster domain sockets" protocol | |
AF_BLUETOOTH | . Bluetooth low-level socket protocol | |
AF_ALG | . カーネルの暗号 API へのインターフェース | |
AF_VSOCK | . VSOCK (originally "VMWare VSockets") protocol for hypervisor-guest communication | vsock(7) |
AF_KCM | . KCM (kernel connection multiplexer) interface | |
AF_XDP | . XDP (express data path) interface |
Further details of the above address families, as well as information on several other address families, can be found in address_families(7).
ソケットは type で指定される型を持ち、それは通信方式 (semantics) を指定する。 定義されている型は現在以下の通り。
ある種のソケット型が全てのプロトコルファミリーで実装されているわけではない。
Linux 2.6.27 以降では、 type 引数は二つ目の目的にも使用される。 ソケットの型を指定するのに加えて、 以下の値のいくつかをビット単位の論理和 (OR) で指定することで、 socket() の振舞いを変更することができる。
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) 関数はそれぞれオプションの設定と取得を行なう。
成功した場合、新しいソケットのファイルディスクリプターを返す。 エラーが発生した場合は -1 を返し、 errno を適切に設定する。
下位のプロトコルモジュールから他のエラーが生成されるかもしれない。
POSIX.1-2001, POSIX.1-2008, 4.4BSD.
フラグ SOCK_NONBLOCK, SOCK_CLOEXEC は Linux 固有である。
socket() は 4.2BSD で登場した。一般に、(System V の変種を含めて) BSD のソケット層の互換性をサポートしている BSD 以外のシステムへの、 または、BSD 以外のシステムからの移植ができる。
POSIX.1 では <sys/types.h> のインクルードは必須とされておらず、 Linux ではこのヘッダーファイルは必要ではない。 しかし、歴史的には、いくつかの実装 (BSD 系) でこのヘッダーファイルが 必要であり、移植性が必要なアプリケーションではこのファイルを インクルードするのが賢明であろう。
4.x BSD において定数を使用する場合、プロトコルファミリーには PF_UNIX, PF_INET 等を使用している。一方でアドレスファミリーには AF_UNIX, AF_INET 等が使用されている。 しかしながら BSD のマニュアルでは 「一般にプロトコルファミリーは アドレスファミリーと同じものである。」 と保証している。 それ以外の規格では全ての場所で AF_* が使用されている。
socket() の利用例が getaddrinfo(3) に記載されている。
accept(2), bind(2), close(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), write(2), getprotoent(3), address_families(7), ip(7), socket(7), tcp(7), udp(7), unix(7)
“An Introductory 4.3BSD Interprocess Communication Tutorial” and “BSD Interprocess Communication Tutorial”, (UNIX Programmer's Supplementary Documents Volume 1. として再版された)
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
2020-06-09 | Linux |