名 前
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() は エ ラ ー EAGAIN か EWOULDBLOCK で 失 敗 す る 。 ソ ケ ッ ト へ の 接 続 到 着 を 知 る に は 、 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 引 き 数 が ユ ー ザ ー ア ド レ ス 空 間 の 書 き 込 み 可 能 領 域 に な い 。
有 効 な 接 続 が 到 着 す る 前 に 捕 捉 さ れ た シ グ ナ ル に よ っ て シ ス テ ム コ ー ル が 中 断 さ れ た 。 signal(7) 参 照 。
状 態 で
は な い 。 も し
く は 、 addrlen が 不
正 で あ る (例 え
ば 、 負 の 場 合
な ど )。 (accept4()) flags に 不 正 な 値 が 指 定 さ れ て い る 。 EMFILE 1プ ロ セ ス が オ ー プ ン で き る フ ァ イ ル デ ィ ス ク リ プ タ ー 数 の 上 限 に 達 し た 。 ENFILE オ ー プ ン さ れ た フ ァ イ ル の 総 数 が シ ス テ ム 全 体 の 上 限 に 達 し て い た 。
ENOTSOCK デ
ィ ス ク リ プ タ
ー は ソ ケ ッ ト
で は な く フ ァ
イ ル を 参 照 し
て い る 。
Linux の accept() は 以 下 の エ ラ ー で 失 敗 す る :
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_NONBLOCK や O_ASYNC な ど ) を 継 承 「 し な い 」 。 こ の 動 作 は 標 準 的 な BSD ソ ケ ッ ト の 実 装 と は 異 な っ て い る 。 移 植 性 を 考 慮 し た プ ロ グ ラ ム で は フ ァ イ ル 状 態 フ ラ グ が 継 承 さ れ る か ど う か は 前 提 に せ ず 、 常 に accept() が 返 し た ソ ケ ッ ト に 対 し て 全 て の 必 要 な フ ラ グ を 明 示 的 に 設 定 す る よ う に す べ き で あ る 。 注 意POSIX.1−2001 で は <sys/types.h> の イ ン ク ル ー ド は 必 須 と さ れ て お ら ず 、 Linux で は こ の ヘ ッ ダ ー フ ァ イ ル は 必 要 で は な い 。 し か し 、 歴 史 的 に は 、 い く つ か の 実 装 (BSD 系 ) で こ の ヘ ッ ダ ー フ ァ イ ル が 必 要 で あ り 、 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は こ の フ ァ イ ル を イ ン ク ル ー ド す る の が 賢 明 で あ ろ う 。 SIGIO が 届 け ら れ た 後 や 、 select(2) ま た は poll(2) が 読 み 込 み 可 能 イ ベ ン ト を 返 し た 後 に 、 必 ず し も 待 機 中 の 接 続 が あ る と は 限 ら な い 。 な ぜ な ら そ の 接 続 は 、 accept() が 呼 ば れ る 前 に 、 非 同 期 的 な ネ ッ ト ワ ー ク エ ラ ー や 他 の ス レ ッ ド か ら 呼 ば れ た (別 の ) accept に よ っ て 削 除 さ れ て い る か も し れ な い か ら で あ る 。 こ の 場 合 、 そ の accept() 呼 び 出 し は 停 止 (block) し 、 次 の 接 続 の 到 着 を 待 ち つ づ け る 。 accept() に 停 止 を 行 わ せ な い よ う に す る に は 、 引 き 数 に 渡 す ソ ケ ッ ト sockfd に O_NONBLOCK フ ラ グ を セ ッ ト し て お く 必 要 が あ る (socket(7) を 見 よ )。 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/ に 書 か れ て い る 。 |