Manpages

名 前

accept, accept4 − ソ ケ ッ ト へ の 接 続 を 受 け る

書 式

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

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

#define _GNU_SOURCE /* feature_test_macros(7) 参 照 */
#include <sys/socket.h>

int accept4(int sockfd, struct sockaddr *addr,
socklen_t *
addrlen, int flags);

説 明

accept() シ ス テ ム コ ー ル は 、 接 続 指 向 の ソ ケ ッ ト 型 (SOCK_STREAM, SOCK_SEQPACKET) で 用 い ら れ る 。 こ の 関 数 は 、 接 続 待 ち ソ ケ ッ ト socket 宛 て の 保 留 状 態 の 接 続 要 求 が 入 っ て い る キ ュ ー か ら 先 頭 の 接 続 要 求 を 取 り 出 し 、 接 続 済 み ソ ケ ッ ト を 新 規 に 生 成 し 、 そ の ソ ケ ッ ト を 参 照 す る 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す 。 新 規 に 生 成 さ れ た ソ ケ ッ ト は 、 接 続 待 ち (listen) 状 態 で は な い 。 も と も と の ソ ケ ッ ト sockfd は こ の 呼 び 出 し に よ っ て 影 響 を 受 け な い 。 引 き 数 sockfd は 、 socket(2) に よ っ て 生 成 さ れ 、 bind(2) に よ っ て ロ ー カ ル ア ド レ ス に バ イ ン ド さ れ 、 listen(2) を 経 て 接 続 を 待 っ て い る ソ ケ ッ ト で あ る 。

addr 引 き 数 は sockaddr 構 造 体 へ の ポ イ ン タ ー で あ る 。 こ の 構 造 体 に は 接 続 相 手 の ソ ケ ッ ト の ア ド レ ス が 入 っ て い る 。 addr 引 き 数 で 返 さ れ る ア ド レ ス の 正 確 な フ ォ ー マ ッ ト は 、 ソ ケ ッ ト の ア ド レ ス 種 別 に よ っ て 変 わ る (socket(2) お よ び そ れ ぞ れ の プ ロ ト コ ル の man ペ ー ジ を 参 照 )。 addr が NULL の 場 合 、 addr に は 何 も 入 ら な い 。 こ の 場 合 、 addrlen は 使 用 さ れ ず 、 こ の 引 き 数 は NULL に し て お く べ き で あ る 。

addrlen 引 き 数 は 入 出 力 両 用 の 引 き 数 で あ る 。 呼 び 出 し 時 に は 、 呼 び 出 し 元 が addr が 指 す 構 造 体 の サ イ ズ (バ イ ト 単 位 ) で 初 期 化 し て お か な け れ ば な ら な い 。 返 っ て く る 時 に は 、 接 続 相 手 の ア ド レ ス の 実 際 の 大 き さ が 格 納 さ れ る 。 渡 さ れ た バ ッ フ ァ ー が 小 さ 過 ぎ た 場 合 は 、 返 さ れ る ア ド レ ス の 末 尾 が 切 り 詰 め ら れ る 。 こ の 場 合 に は 、 addrlen に は 、 呼 び 出 し 時 に 指 定 さ れ た 値 よ り も 大 き な 値 が 格 納 さ れ る 。 キ ュ ー に 保 留 と な っ て い る 接 続 要 求 が な く 、 か つ ソ ケ ッ ト が 非 停 止 に な っ て い な い と き は 、 accept() は 接 続 が 発 生 す る ま で 呼 び 出 し 元 を 停 止 (block) す る 。 ソ ケ ッ ト が 非 停 止 に な っ て い て 、 待 ち 状 態 の 接 続 要 求 が キ ュ ー に 無 い と き は 、 accept() は エ ラ ー EAGAINEWOULDBLOCK で 失 敗 す る 。 ソ ケ ッ ト へ の 接 続 到 着 を 知 る に は 、 select(2) ま た は poll(2) を 用 い れ ば よ い 。 新 し い 接 続 要 求 が 来 る と ソ ケ ッ ト は 読 み 込 み 可 能 に な る の で 、 そ う し た ら accept() を 呼 ん で そ の 接 続 に 対 す る ソ ケ ッ ト を 取 得 す れ ば よ い 。 あ る い は ソ ケ ッ ト に 設 定 を 行 い 、 何 ら か の ア ク シ ョ ン が あ っ た と き に SIGIO を 配 送 (deliver) さ せ る よ う に す る こ と も で き る 。 詳 細 は socket(7) を 参 照 の こ と 。 明 示 的 な 接 続 確 認 (confirmation) を 必 要 と す る よ う な プ ロ ト コ ル (DECNet な ど ) で は 、 accept() は 単 に 次 の 接 続 要 求 を キ ュ ー か ら 取 り 出 す だ け で あ り 、 接 続 確 認 は 行 わ な い こ と に 注 意 せ よ 。 接 続 確 認 は 、 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 す る 通 常 の 読 み 取 り /書 き 込 み に よ っ て な さ れ 、 接 続 拒 否 (rejection) は 新 し い ソ ケ ッ ト を ク ロ ー ズ す る こ と に よ っ て な さ れ る 。 現 在 の と こ ろ 、 Linux 上 で こ れ ら の セ マ ン テ ィ ク ス を 持 つ の は DECNet だ け で あ る 。

flags が 0 の 場 合 、 accept4() は accept() と 同 じ で あ る 。 flags に 以 下 の 値 を ビ ッ ト 毎 の 論 理 和 (OR) で 指 定 す る こ と で 、 異 な る 動 作 を さ せ る こ と が で き る 。

SOCK_NONBLOCK 新 し く 生 成 さ れ る オ ー プ ン フ ァ イ ル 記 述

(open file

description) の O_NONBLOCK フ ァ イ ル ス テ ー タ ス フ ラ グ を セ ッ ト す る 。 こ の フ ラ グ を 使 う こ と で 、 O_NONBLOCK を セ ッ ト す る た め に fcntl(2) を 追 加 で 呼 び 出 す 必 要 が な く な る 。

SOCK_CLOEXEC 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て

close−on−exec

(FD_CLOEXEC) フ ラ グ を セ ッ ト す る 。 こ の フ ラ グ が 役 に 立 つ 理 由 に つ い て は 、 open(2)O_CLOEXEC フ ラ グ の 説 明 を 参 照 の こ と 。

返 り 値

成 功 し た 場 合 、 こ れ ら の シ ス テ ム コ ー ル は 受 け 付 け た ソ ケ ッ ト の デ ィ ス ク リ プ タ ー で あ る 非 負 の 整 数 値 を 返 す 。 エ ラ ー が 発 生 し た 場 合 は −1 を 返 し 、 errno を 適 切 に 設 定 す る 。 エ ラ ー 処 理

Linux の accept() (と accept4()) は 、 新 し い ソ ケ ッ ト に お け る 、 発 生 済 み の ネ ッ ト ワ ー ク エ ラ ー を accept() か ら の エ ラ ー コ ー ド と し て 渡 す 。 こ の 振 舞 い は BSD ソ ケ ッ ト の 実 装 と は 異 な る 。 信 頼 性 の 高 い 動 作 を 行 う た め に は 、 ア プ リ ケ ー シ ョ ン は プ ロ ト コ ル で 定 義 さ れ て い る ネ ッ ト ワ ー ク エ ラ ー の 検 知 を accept() の あ と に 行 い 、 そ れ ら の エ ラ ー を EAGAIN と 同 じ よ う に 扱 い 、 再 試 行 (retry) を 行 う べ き で あ る 。 TCP/IP で は 、 以 下 の エ ラ ー が 該 当 す る : ENETDOWN, EPROTO, ENOPROTOOPT, EHOSTDOWN, ENONET, EHOSTUNREACH, EOPNOTSUPP, ENETUNREACH

エ ラ ー

EAGAIN ま た は EWOULDBLOCK ソ ケ ッ ト が 非 停 止 に な っ て い て 、 か つ 受 付 け 対 象 の 接 続 が 存 在 し な い 。 POSIX.1−2001 は 、 こ の 場 合 に ど ち ら の エ ラ ー を 返 す こ と も 認 め て お り 、 こ れ ら 2 つ の 定 数 が 同 じ 値 を 持 つ こ と も 求 め て い な い 。 し た が っ て 、 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は 、 両 方 の 可 能 性 を 確 認 す べ き で あ る 。

EBADF デ ィ ス ク リ プ タ ー が 不 正 。

ECONNABORTED 接 続 が 中 止 さ れ た 。

EFAULT

addr 引 き 数 が ユ ー ザ ー ア ド レ ス 空 間 の 書 き 込 み 可 能 領 域 に な い 。

EINTR

有 効 な 接 続 が 到 着 す る 前 に 捕 捉 さ れ た シ グ ナ ル に よ っ て シ ス テ ム コ ー ル が 中 断 さ れ た 。 signal(7) 参 照 。

EINVAL ソ ケ ッ ト が 接 続 待 ち

状 態 で は な い 。 も し く は 、 addrlen が 不 正 で あ る (例 え ば 、 負 の 場 合 な ど )。
EINVAL

(accept4()) flags に 不 正 な 値 が 指 定 さ れ て い る 。

EMFILE

1プ ロ セ ス が オ ー プ ン で き る フ ァ イ ル デ ィ ス ク リ プ タ ー 数 の 上 限 に 達 し た 。

ENFILE

オ ー プ ン さ れ た フ ァ イ ル の 総 数 が シ ス テ ム 全 体 の 上 限 に 達 し て い た 。

ENOBUFS, ENOMEM メ モ リ ー が 足 り な い 。 多 く の 場 合 は 、 シ ス テ ム メ モ リ ー が 足 り な い わ け で は な く 、 ソ ケ ッ ト バ ッ フ ァ ー の 大 き さ に よ る メ モ リ ー 割 り 当 て の 制 限 で あ る 。

ENOTSOCK デ ィ ス ク リ プ タ ー は ソ ケ ッ ト で は な く フ ァ イ ル を 参 照 し て い る 。
EOPNOTSUPP
参 照 し て い る ソ ケ ッ ト の 型 が SOCK_STREAM で な い 。

EPROTO プ ロ ト コ ル エ ラ ー 。 上 記 に 加 え て 、

Linux の accept() は 以 下 の エ ラ ー で 失 敗 す る :

EPERM フ ァ イ ア ウ ォ ー ル の ル ー ル に よ り 接 続 が 禁 止 さ れ た 。 こ の 他 に 、 新 し い ソ ケ ッ ト に 対 す る ネ ッ ト ワ ー ク エ ラ ー が 返 さ れ る こ と も あ る 。 こ れ ら は そ れ ぞ れ の プ ロ ト コ ル で 定 義 さ れ て い る 。 い ろ い ろ な

Linux カ ー ネ ル で は 、 以 下 に 示 す よ う な エ ラ ー を 返 す こ と も あ る 。 ENOSR, ESOCKTNOSUPPORT, EPROTONOSUPPORT, ETIMEDOUT. ERESTARTSYS が ト レ ー ス の 最 中 に 現 れ る こ と も あ る 。

バ ー ジ ョ ン

accept4() シ ス テ ム コ ー ル は Linux 2.6.28 以 降 で 利 用 可 能 で あ る 。 glibc で の サ ポ ー ト は バ ー ジ ョ ン 2.10 以 降 で 利 用 可 能 で あ る 。

準 拠

accept(): POSIX.1−2001, SVr4, 4.4BSD, (accept() は 4.2BSD で 初 め て 実 装 さ れ た ).

accept4() は 非 標 準 の Linux に よ る 拡 張 で あ る 。

Linux で は 、 accept() が 返 す 新 し い ソ ケ ッ ト は listen を 行 っ て い る ソ ケ ッ ト の フ ァ イ ル 状 態 フ ラ グ (O_NONBLOCKO_ASYNC な ど ) を 継 承 「 し な い 」 。 こ の 動 作 は 標 準 的 な BSD ソ ケ ッ ト の 実 装 と は 異 な っ て い る 。 移 植 性 を 考 慮 し た プ ロ グ ラ ム で は フ ァ イ ル 状 態 フ ラ グ が 継 承 さ れ る か ど う か は 前 提 に せ ず 、 常 に accept() が 返 し た ソ ケ ッ ト に 対 し て 全 て の 必 要 な フ ラ グ を 明 示 的 に 設 定 す る よ う に す べ き で あ る 。

注 意

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

SIGIO が 届 け ら れ た 後 や 、 select(2) ま た は poll(2) が 読 み 込 み 可 能 イ ベ ン ト を 返 し た 後 に 、 必 ず し も 待 機 中 の 接 続 が あ る と は 限 ら な い 。 な ぜ な ら そ の 接 続 は 、 accept() が 呼 ば れ る 前 に 、 非 同 期 的 な ネ ッ ト ワ ー ク エ ラ ー や 他 の ス レ ッ ド か ら 呼 ば れ た (別 の ) accept に よ っ て 削 除 さ れ て い る か も し れ な い か ら で あ る 。 こ の 場 合 、 そ の accept() 呼 び 出 し は 停 止 (block) し 、 次 の 接 続 の 到 着 を 待 ち つ づ け る 。 accept() に 停 止 を 行 わ せ な い よ う に す る に は 、 引 き 数 に 渡 す ソ ケ ッ ト sockfdO_NONBLOCK フ ラ グ を セ ッ ト し て お く 必 要 が あ る (socket(7) を 見 よ )。

socklen_t 型
accept
() の 第 3 引 き 数 は 、 も と も と int * と 宣 言 さ れ て い た (libc4 や libc5, 4.x BSD, SunOS 4, SGI な ど 多 く の シ ス テ ム で は そ う な っ て い る )。 POSIX.1g draft 標 準 は 、 こ れ を size_t * に 変 更 し よ う と し 、 SunOS 5 で は そ う 宣 言 さ れ て い る 。 後 に POSIX drafts に は socklen_t * が 含 ま れ る よ う に な り 、 Single UNIX Specification や glibc2 で は こ の よ う に 宣 言 さ れ る よ う に な っ た 。 Linus Torvald の 発 言 を 引 用 す る : 「 ま と も な ラ イ ブ ラ リ を 作 り た け れ ば 、 "socklen_t" の サ イ ズ は int と 同 じ に し な き ゃ な ら な い 。 さ も な い と BSD ソ ケ ッ ト 層 を 破 壊 す る こ と に な っ ち ゃ う 。 POSIX は 最 初 こ い つ を size_t に し た ん で 、 ぼ く は 彼 ら に 文 句 を が な り た て た (多 分 そ う い う 人 は 他 に も い た と 思 う 。 多 く は な か っ た よ う だ け ど )。 こ い つ を size_t に す る の は 完 全 に い か れ て る 。 例 え ば 64 ビ ッ ト ア ー キ テ ク チ ャ ー で は 、 size_t が "int" と 同 じ サ イ ズ だ な ん て こ と は ほ と ん ど な い か ら ね 。 こ の サ イ ズ は "int" と 同 じ で な き ゃ 『 ダ メ 』 な ん だ 。 BSD ソ ケ ッ ト イ ン タ ー フ ェ ー ス っ て い う の は そ う い う も の な ん だ か ら 。 ま あ と も か く POSIX の 人 た ち も 、 "socklen_t" を 作 る と い う 解 決 策 を な ん と か ひ ね り 出 し た 。 そ も そ も 最 初 か ら 放 っ て お け ば 良 か っ た ん だ が 、 い じ っ ち ゃ っ た 以 上 、 名 前 付 き の 型 を 持 た せ な き ゃ な ら な い 、 と 思 っ た み た い だ ね 。 な ん で か は わ か ん な い け ど (き っ と 最 初 に や っ ち ま っ た 馬 鹿 な 間 違 い で 顔 を つ ぶ し た く な か っ た か ら 、 こ っ そ り 名 前 を 付 け 替 え て 自 分 た ち の 大 失 敗 を ご ま か そ う と し た ん だ ろ う )。 」

bind(2) 参 照 。

関 連 項 目

bind(2), connect(2), listen(2), select(2), socket(2), socket(7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。