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) を指定する。
定義されている型は現在以下の通り。
- SOCK_STREAM
- 順序性と信頼性があり、双方向の、接続された
バイトストリーム (byte
stream) を提供する。
帯域外 (out-of-band)
データ転送メカニズムもサポートされる。
- SOCK_DGRAM
- データグラム
(コネクションレス、信頼性無し、固定最大長メッセージ)
をサポートする。
- SOCK_SEQPACKET
- 固定最大長のデータグラム転送パスに基づいた順序性、信頼性のある
双方向の接続に基づいた通信を提供する。受け取り側ではそれぞれの入力
システムコールでパケット全体を読み取ることが要求される。
- SOCK_RAW
- 生のネットワークプロトコルへのアクセスを提供する。
- SOCK_RDM
- 信頼性はあるが、順序は保証しないデータグラム層を提供する。
- SOCK_PACKET
- 廃止されており新しいプログラムで使用してはいけない。
packet(7)
を参照すること
ある種のソケット型が全てのプロトコルファミリーで実装されているわけではない。
Linux 2.6.27 以降では、
type
引数は二つ目の目的にも使用される。
ソケットの型を指定するのに加えて、
以下の値のいくつかをビット単位の論理和
(OR) で指定することで、
socket()
の振舞いを変更することができる。
- SOCK_NONBLOCK
- Set the O_NONBLOCK file status flag on the open file
description (see open(2)) referred to by the new file descriptor.
Using this flag saves extra calls to fcntl(2) to achieve the same
result.
- SOCK_CLOEXEC
- 新しいファイルディスクリプターに対して
close-on-exec ( FD_CLOEXEC)
フラグをセットする。
このフラグが役に立つ理由については、
open(2) の O_CLOEXEC
フラグの説明を参照のこと。
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
を適切に設定する。
- EACCES
- 指定されたタイプまたはプロトコルのソケットを作成する許可が与えられていない。
- EAFNOSUPPORT
- 指定されたアドレスファミリーがサポートされていない。
- EINVAL
- 知らないプロトコル、または利用できないプロトコルファミリーである。
- EINVAL
-
type
に無効なフラグが指定されている。
- EMFILE
- 1プロセスがオープンできるファイルディスクリプター数の上限に達した。
- ENFILE
- オープンされたファイルの総数がシステム全体の上限に達していた。
-
ENOBUFS または ENOMEM
- 十分なメモリーがない。十分な資源が解放されるまではソケットを
作成することはできない。
- EPROTONOSUPPORT
- このドメインでは指定されたプロトコルまたはプロトコルタイプが
サポートされていない。
下位のプロトコルモジュールから他のエラーが生成されるかもしれない。
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/
に書かれている。