名 前
socket − 通 信 の た め の 端 点 (endpoint) を 作 成 す る
書 式
#include
<sys/types.h> /* 「 注 意
」 参 照 */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
説 明
socket() は 通 信 の た め の 端 点 (endpoint) を 作 成 し 、 デ ィ ス ク リ プ タ ー を 返 す 。
domain 引 数 は 通 信 を 行 な う ド メ イ ン を 指 定 す る ; こ れ は ど の プ ロ ト コ ル フ ァ ミ リ ー (protocol family) を 通 信 に 使 用 す る か を 指 定 す る 。 こ れ ら の フ ァ ミ リ ー は <sys/socket.h> に 定 義 さ れ て い る 。 現 在 、 理 解 で き る フ ォ ー マ ッ ト は 以 下 の 通 り 。
ソ ケ ッ ト は 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 新 し く 生 成 さ れ る オ ー プ ン フ ァ イ ル 記 述 |
(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) を 参 照 す る こ と 。 プ ロ ト コ ル 名 を ど う や っ て プ ロ ト コ ル 番 号 に 対 応 さ せ る か に つ い て は 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 プ ロ セ ス の フ ァ イ ル テ ー ブ ル が 溢 れ て い る 。 | |
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 で は <sys/types.h> の イ ン ク ル ー ド は 必 須 と さ れ て お ら ず 、 Linux で は こ の ヘ ッ ダ ー フ ァ イ ル は 必 要 で は な い 。 し か し 、 歴 史 的 に は 、 い く つ か の 実 装 (BSD 系 ) で こ の ヘ ッ ダ ー フ ァ イ ル が 必 要 で あ り 、 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は こ の フ ァ イ ル を イ ン ク ル ー ド す る の が 賢 明 で あ ろ う 。
4.x BSD に お い て 定 数 を 使 用 す る 場 合 、 プ ロ ト コ ル フ ァ ミ リ ー に は PF_UNIX, PF_INET 等 を 使 用 し て い る 。 一 方 で ア ド レ ス フ ァ ミ リ ー に は AF_UNIX, AF_INET 等 が 使 用 さ れ て い る 。 し か し な が ら BSD の マ ニ ュ ア ル で は 「 一 般 に プ ロ ト コ ル フ ァ ミ リ ー は ア ド レ ス フ ァ ミ リ ー と 同 じ も の で あ る 。 」 と 保 証 し て い る 。 そ れ 以 外 の 規 格 で は 全 て の 場 所 で AF_* が 使 用 さ れ て い る 。
AF_ALG プ ロ ト コ ル 種 別 は Linux 2.6.38 で 追 加 さ れ た 。 こ の イ ン タ ー フ ェ ー ス の 詳 し い 情 報 は 、 カ ー ネ ル の ソ ー ス フ ァ イ ル Documentation/crypto/crypto−API−userspace.txt に 書 か れ て い る 。
例
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), write(2), getprotoent(3), 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 プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。