socketのヘルプ・マニュアル
日本語 英語
socket --help
man socket
SOCKET(2) Linux Programmer’s Manual SOCKET(2)
名前
socket - 通信のための端点(endpoint)を作成する
書式
#include /* 「注意」参照 */
#include
int socket(int domain, int type, int protocol);
説明
socket() は 通 信 の た め の 端 点(endpoint)を作成し、ディスクリプタ
ー(descriptor)を返す。
domain 引数は通信を行なうドメインを指定する; これはどのプロトコル・ファ
ミ リ(protocol family)を通信に使用するかを指定する。これらのファミリは
に定義されている。現在、理解できるフォーマットは以下の通
り。
名前 目的 マニュアル
AF_UNIX, AF_LOCAL ローカル通信 unix(7)
AF_INET IPv4 インターネット・プロトコル ip(7)
AF_INET6 IPv6 インターネット・プロトコル ipv6(7)
AF_IPX IPX - Novell プロトコル
AF_NETLINK カーネル・ユーザ・デバイス netlink(7)
AF_X25 ITU-T X.25 / ISO-8208 プロトコル x25(7)
AF_AX25 アマチュア無線 AX.25 プロトコル
AF_ATMPVC 生の ATM PVC にアクセスする
AF_APPLETALK アップルトーク ddp(7)
AF_PACKET 低レベルのパケットインターフェー packet(7)
ス
ソケットは type で指定される型を持ち、それは通信方式(semantics)を指定す
る。定義されている型は現在以下の通り。
SOCK_STREAM 順序性と信頼性があり、双方向の、接続されたバイト・スト
リーム(byte stream)を提供する。帯域外(out-of-band)デ ー
タ転送メカニズムもサポートされる。
SOCK_DGRAM データグラム(接続、信頼性無し、固定最大長メッセージ) を
サポートする。
SOCK_SEQPACKET 固定最大長のデータグラム転送パスに基づいた順序性、信 頼
性 のある双方向の接続に基づいた通信を提供する。受け取り
側ではそれぞれの入力システム・コールでパケット全体を 読
み取ることが要求される。
SOCK_RAW 生のネットワーク・プロトコルへのアクセスを提供する。
SOCK_RDM 信頼性はあるが、順序は保証しないデータグラム層を提供す
る。
SOCK_PACKET 廃止されており新しいプログラムで使用してはいけ な い 。
packet(7) を参照すること
あ る種のソケット型が全てのプロトコル・ファミリで実装されているわけでは
ない。例えば SOCK_SEQPACKET は AF_INET には実装されていない。
Linux 2.6.27 以降では、 type 引数は二つ目の目的にも使用される。ソケット
の 型 を指定するのに加えて、以下の値のいくつかをビット単位の論理和 (OR)
で指定することで、 socket() の振舞いを変更することができる。
SOCK_NONBLOCK 新しく生成されるオープン フ ァ イ ル 記 述 (open file
description) の O_NONBLOCK ファイルステータスフラグをセ
ットする。このフラグを使うことで、 O_NONBLOCK をセッ ト
するために fcntl(2) を追加で呼び出す必要がなくなる。
SOCK_CLOEXEC 新しいファイル・ディスクリプターに対して close-on-exec
(FD_CLOEXEC) フラグをセットする。このフラグが役に立つ理
由 については、 open(2) の O_CLOEXEC フラグの説明を参照
のこと。
protocol はソケットによって使用される固有のプロトコルを指定する。通常そ
れ ぞれのソケットは、与えられたプロトコル・ファミリの種類ごとに一つのプ
ロトコルのみをサポートする。その場合は protocol に 0 を指定できる。しか
し 、多くのプロトコルが存在してもかまわない。この場合にはこの方法により
固有のプロトコルを指定する必要がある。使用されるプロトコル番号は通信 の
行なわれる“通信ドメイン”に固有である; protocols(5) を参照すること。プロ
トコル名をどうやってプロトコル番号に対応させるかに つ い て は getpro-
toent(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 イベントの非 同 期 (asyn-
chronous) 通知を SIGIO を経由で受け取るプロセスやプロセス・グループを設
定するのにも使用できる。 F_SETOWN を使用することは FIOSETOWN ま た は
SIOCSPGRP の引数で ioctl(2) を使用することと等価である。
ネ ッ ト ワークがプロトコル・モジュールにエラー状態を伝えた場合 (例えば
、IP の ICMP メッセージを使用して)には、ソケットのペンディング・エラ ー
・ フラグが設定される。次にこのソケットを操作した時にペンディングされて
いたエラー・コードが返される。プロトコルによってはエラーについてのよ り
詳 しい情報を受け取るためにソケットごとのエラー・キューを受け取ることが
可能である。 ip(7) の IP_RECVERR を参照すること。
ソケットの操作はソケット・レベル options によって制御される。これらのオ
プ ションは に定義されている。 setsockopt(2) と getsock-
opt(2) 関数はそれぞれオプションの設定と取得を行なう。
返り値
成功した場合、新しいソケットのファイル・ディスクリプターを返す。エラ ー
が発生した場合は -1 を返し、 errno を適切に設定する。
エラー
EACCES 指定されたタイプまたはプロトコルのソケットを作成する許可が与えら
れていない。
EAFNOSUPPORT
指定されたアドレスファミリーがサポートされていない。
EINVAL 知らないプロトコル、または利用できないプロトコル・ファミリである
。
EINVAL type に無効なフラグが指定されている。
EMFILE プロセスのファイルテーブルが溢れている。
ENFILE オープンされたファイルの総数がシステム上限に達している。
ENOBUFS または ENOMEM
十分なメモリがない。十分な資源が解放されるまではソケットを作成す
ることはできない。
EPROTONOSUPPORT
このドメインでは指定されたプロトコルまたはプロトコル・タイプがサ
ポートされていない。
下位のプロトコル・モジュールから他のエラーが生成されるかもしれない。
準拠
4.4BSD, POSIX.1-2001.
フラグ SOCK_NONBLOCK, SOCK_CLOEXEC は Linux 固有である。
socket() は 4.2BSD で登場した。一般に、(System V の変種を含めて) BSD の
ソケット層の互換性をサポートしている BSD 以外のシステムへの 、 ま た は
、BSD 以外のシステムからの移植ができる。
注意
POSIX.1-2001 で は のインクルードは必須とされておらず、
Linux ではこのヘッダファイルは必要ではない。しかし、歴史的には、いく つ
か の実装 (BSD 系) でこのヘッダファイルが必要であり、移植性が必要なアプ
リケーションではこのファイルをインクルードするのが賢明であろう。
4.x BSD において定数を使用する場合、プロトコル・ファミリーには PF_UNIX,
PF_INET 等を使用している。一方でアドレス・ファミリーには AF_UNIX 等が使
用されている。しかしながら BSD のマニュアルでは「一般にプロトコル・ファ
ミ リーはアドレス・ファミリーと同じものである。」と保証している。それで
それ以外の規格では全ての場所で AF_* が使用されている。
例
socket() の利用例が getaddrinfo(3) に記載されている。
関連項目
accept(2), bind(2), connect(2), fcntl(2), getpeername(2), getsock-
name(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2),
select(2), send(2), shutdown(2), socketpair(2), write(2), getpro-
toent(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 Supple-
mentary Documents Volume 1 として再版された。
Linux 2009-01-19 SOCKET(2)
SOCKET(2) Linux Programmer’s Manual SOCKET(2)
NAME
socket - create an endpoint for communication
SYNOPSIS
#include /* See NOTES */
#include
int socket(int domain, int type, int protocol);
DESCRIPTION
socket() creates an endpoint for communication and returns a descrip-
tor.
The domain argument specifies a communication domain; this selects the
protocol family which will be used for communication. These families
are defined in . The currently understood formats
include:
Name Purpose Man page
AF_UNIX, AF_LOCAL Local communication unix(7)
AF_INET IPv4 Internet protocols ip(7)
AF_INET6 IPv6 Internet protocols ipv6(7)
AF_IPX IPX - Novell protocols
AF_NETLINK Kernel user interface device netlink(7)
AF_X25 ITU-T X.25 / ISO-8208 protocol x25(7)
AF_AX25 Amateur radio AX.25 protocol
AF_ATMPVC Access to raw ATM PVCs
AF_APPLETALK Appletalk ddp(7)
AF_PACKET Low level packet interface packet(7)
The socket has the indicated type, which specifies the communication
semantics. Currently defined types are:
SOCK_STREAM Provides sequenced, reliable, two-way, connection-based
byte streams. An out-of-band data transmission mecha-
nism may be supported.
SOCK_DGRAM Supports datagrams (connectionless, unreliable messages
of a fixed maximum length).
SOCK_SEQPACKET Provides a sequenced, reliable, two-way connection-
based data transmission path for datagrams of fixed
maximum length; a consumer is required to read an
entire packet with each input system call.
SOCK_RAW Provides raw network protocol access.
SOCK_RDM Provides a reliable datagram layer that does not guar-
antee ordering.
SOCK_PACKET Obsolete and should not be used in new programs; see
packet(7).
Some socket types may not be implemented by all protocol families; for
example, SOCK_SEQPACKET is not implemented for AF_INET.
Since Linux 2.6.27, the type argument serves a second purpose: in addi-
tion to specifying a socket type, it may include the bitwise OR of any
of the following values, to modify the behavior of socket():
SOCK_NONBLOCK Set the O_NONBLOCK file status flag on the new open
file description. Using this flag saves extra calls to
fcntl(2) to achieve the same result.
SOCK_CLOEXEC Set the close-on-exec (FD_CLOEXEC) flag on the new file
descriptor. See the description of the O_CLOEXEC flag
in open(2) for reasons why this may be useful.
The protocol specifies a particular protocol to be used with the
socket. Normally only a single protocol exists to support a particular
socket type within a given protocol family, in which case protocol can
be specified as 0. However, it is possible that many protocols may
exist, in which case a particular protocol must be specified in this
manner. The protocol number to use is specific to the “communication
domain” in which communication is to take place; see protocols(5). See
getprotoent(3) on how to map protocol name strings to protocol numbers.
Sockets of type SOCK_STREAM are full-duplex byte streams, similar to
pipes. They do not preserve record boundaries. A stream socket must
be in a connected state before any data may be sent or received on it.
A connection to another socket is created with a connect(2) call. Once
connected, data may be transferred using read(2) and write(2) calls or
some variant of the send(2) and recv(2) calls. When a session has been
completed a close(2) may be performed. Out-of-band data may also be
transmitted as described in send(2) and received as described in
recv(2).
The communications protocols which implement a SOCK_STREAM ensure that
data is not lost or duplicated. If a piece of data for which the peer
protocol has buffer space cannot be successfully transmitted within a
reasonable length of time, then the connection is considered to be
dead. When SO_KEEPALIVE is enabled on the socket the protocol checks
in a protocol-specific manner if the other end is still alive. A SIG-
PIPE signal is raised if a process sends or receives on a broken
stream; this causes naive processes, which do not handle the signal, to
exit. SOCK_SEQPACKET sockets employ the same system calls as
SOCK_STREAM sockets. The only difference is that read(2) calls will
return only the amount of data requested, and any data remaining in the
arriving packet will be discarded. Also all message boundaries in
incoming datagrams are preserved.
SOCK_DGRAM and SOCK_RAW sockets allow sending of datagrams to corre-
spondents named in sendto(2) calls. Datagrams are generally received
with recvfrom(2), which returns the next datagram along with the
address of its sender.
SOCK_PACKET is an obsolete socket type to receive raw packets directly
from the device driver. Use packet(7) instead.
An fcntl(2) F_SETOWN operation can be used to specify a process or pro-
cess group to receive a SIGURG signal when the out-of-band data arrives
or SIGPIPE signal when a SOCK_STREAM connection breaks unexpectedly.
This operation may also be used to set the process or process group
that receives the I/O and asynchronous notification of I/O events via
SIGIO. Using F_SETOWN is equivalent to an ioctl(2) call with the
FIOSETOWN or SIOCSPGRP argument.
When the network signals an error condition to the protocol module
(e.g., using a ICMP message for IP) the pending error flag is set for
the socket. The next operation on this socket will return the error
code of the pending error. For some protocols it is possible to enable
a per-socket error queue to retrieve detailed information about the
error; see IP_RECVERR in ip(7).
The operation of sockets is controlled by socket level options. These
options are defined in . The functions setsockopt(2) and
getsockopt(2) are used to set and get options, respectively.
RETURN VALUE
On success, a file descriptor for the new socket is returned. On
error, -1 is returned, and errno is set appropriately.
ERRORS
EACCES Permission to create a socket of the specified type and/or pro-
tocol is denied.
EAFNOSUPPORT
The implementation does not support the specified address fam-
ily.
EINVAL Unknown protocol, or protocol family not available.
EINVAL Invalid flags in type.
EMFILE Process file table overflow.
ENFILE The system limit on the total number of open files has been
reached.
ENOBUFS or ENOMEM
Insufficient memory is available. The socket cannot be created
until sufficient resources are freed.
EPROTONOSUPPORT
The protocol type or the specified protocol is not supported
within this domain.
Other errors may be generated by the underlying protocol modules.
CONFORMING TO
4.4BSD, POSIX.1-2001.
The SOCK_NONBLOCK and SOCK_CLOEXEC flags are Linux-specific.
socket() appeared in 4.2BSD. It is generally portable to/from non-BSD
systems supporting clones of the BSD socket layer (including System V
variants).
NOTES
POSIX.1-2001 does not require the inclusion of , and this
header file is not required on Linux. However, some historical (BSD)
implementations required this header file, and portable applications
are probably wise to include it.
The manifest constants used under 4.x BSD for protocol families are
PF_UNIX, PF_INET, etc., while AF_UNIX etc. are used for address fami-
lies. However, already the BSD man page promises: "The protocol family
generally is the same as the address family", and subsequent standards
use AF_* everywhere.
EXAMPLE
An example of the use of socket() is shown in getaddrinfo(3).
SEE ALSO
accept(2), bind(2), connect(2), fcntl(2), getpeername(2), getsock-
name(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2),
select(2), send(2), shutdown(2), socketpair(2), write(2), getpro-
toent(3), ip(7), socket(7), tcp(7), udp(7), unix(7)
“An Introductory 4.3BSD Interprocess Communication Tutorial” is
reprinted in UNIX Programmer’s Supplementary Documents Volume 1.
“BSD Interprocess Communication Tutorial” is reprinted in UNIX Program-
mer’s Supplementary Documents Volume 1.
COLOPHON
This page is part of release 3.22 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.
Linux 2009-01-19 SOCKET(2)