Man page - accept4(2)

Packages contains this manual

Available languages:

en fr pl ja ru de

Manual

ACCEPT

名 前
書 式
説 明
返 り 値
エ ラ ー 処 理
エ ラ ー
バ ー ジ ョ ン
準 拠
注 意
socklen_t 型

関 連 項 目
こ の 文 書 に つ い て

名 前

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 で 失 敗 す る 。

In order to be notified of incoming connections on a socket, you can use select (2), poll (2), or epoll (7). A readable event will be delivered when a new connection is attempted and you may then call accept () to get a socket for that connection. Alternatively, you can set the socket to deliver SIGIO when activity occurs on a socket; see socket (7) for details.

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

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 フ ラ グ の 説 明 を 参 照 の こ と 。

返 り 値

On success, these system calls return a file descriptor for the accepted socket (a nonnegative integer). On error, -1 is returned, errno is set appropriately, and addrlen is left unchanged.

エ ラ ー 処 理

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

エ ラ ー

EAGAIN ま た は EWOULDBLOCK

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

EBADF

sockfd が オ ー プ ン さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。

ECONNABORTED

接 続 が 中 止 さ れ た 。

EFAULT

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

EINTR

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

EINVAL

ソ ケ ッ ト が 接 続 待 ち 状 態 で は な い 。 も し く は 、 addrlen が 不 正 で あ る (例 え ば 、 負 の 場 合 な ど )。

EINVAL

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

EMFILE

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

ENFILE

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

ENOBUFS , ENOMEM

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

ENOTSOCK

フ ァ イ ル デ ィ ス ク リ プ タ ー sockfd が ソ ケ ッ ト を 参 照 し て い な い 。

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

明 示 的 な 接 続 確 認 (confirmation) を 必 要 と す る よ う な プ ロ ト コ ル (DECnet な ど ) で は 、 accept () は 単 に 次 の 接 続 要 求 を キ ュ ー か ら 取 り 出 す だ け で あ り 、 接 続 確 認 は 行 わ な い こ と に 注 意 せ よ 。 接 続 確 認 は 、 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 す る 通 常 の 読 み 取 り /書 き 込 み に よ っ て な さ れ 、 接 続 拒 否 (rejection) は 新 し い ソ ケ ッ ト を ク ロ ー ズ す る こ と に よ っ て な さ れ る 。 現 在 の と こ ろ 、 Linux 上 で こ れ ら の セ マ ン テ ィ ク ス を 持 つ の は DECnet だ け で あ る 。

socklen_t 型

In the original BSD sockets implementation (and on other older systems) the third argument of accept () was declared as an int * . A POSIX.1g draft standard wanted to change it into a size_t * C; later POSIX standards and glibc 2.x have socklen_t * .

bind (2) 参 照 。

関 連 項 目

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

こ の 文 書 に つ い て

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