Manpages

名 前

socket − Linux の ソ ケ ッ ト イ ン タ ー フ ェ ー ス

書 式

#include <sys/socket.h>

sockfd = socket(int socket_family, int socket_type, int protocol);

説 明

こ の マ ニ ュ ア ル ペ ー ジ は Linux ネ ッ ト ワ ー ク の ソ ケ ッ ト 層 に 対 す る ユ ー ザ ー イ ン タ ー フ ェ ー ス を 記 述 す る も の で あ る 。 BSD 互 換 ソ ケ ッ ト は 、 ユ ー ザ ー プ ロ セ ス と カ ー ネ ル 内 部 の ネ ッ ト ワ ー ク プ ロ ト コ ル ス タ ッ ク 群 と の 間 に 、 統 一 的 な イ ン タ ー フ ェ ー ス を 提 供 す る も の で あ る 。 プ ロ ト コ ル モ ジ ュ ー ル は プ ロ ト コ ル フ ァ ミ リ ー (protocol familiy) (例 : AF_INET, AF_IPX, AF_PACKET) と ソ ケ ッ ト タ イ プ (socket types) (例 : SOCK_STREAM, SOCK_DGRAM) に 分 類 で き る 。 こ れ ら に 関 す る よ り 詳 し い 情 報 は socket(2) を 参 照 の こ と 。 ソ ケ ッ ト 層 の 関 数 群 こ れ ら の 関 数 は ユ ー ザ ー プ ロ セ ス が パ ケ ッ ト を 送 受 信 し た り 、 そ の 他 の ソ ケ ッ ト 操 作 を 行 っ た り す る た め に 用 い ら れ る 。 詳 細 は そ れ ぞ れ の マ ニ ュ ア ル ペ ー ジ を 見 て ほ し い 。

socket(2) は ソ ケ ッ ト を 生 成 す る 。 connect(2) は ソ ケ ッ ト を リ モ ー ト の ソ ケ ッ ト ア ド レ ス に 接 続 す る 。 bind(2) は ソ ケ ッ ト を ロ ー カ ル の ソ ケ ッ ト ア ド レ ス に バ イ ン ド す る 。 listen(2) は ソ ケ ッ ト に 新 し い 接 続 が 来 た ら 受 信 す る よ う に 伝 え 、 accept(2) は 外 部 か ら や っ て き た 接 続 に 対 し て 新 し い ソ ケ ッ ト を 得 る た め に 用 い ら れ る 。 socketpair(2) は 互 い に 接 続 さ れ た 二 つ の 名 前 無 し ソ ケ ッ ト (anonymous socket) を 返 す (AF_UNIX の よ う な 、 い く つ か の ロ ー カ ル な フ ァ ミ リ ー で し か 実 装 さ れ て い な い )。

send(2), sendto(2), sendmsg(2) は ソ ケ ッ ト を 通 し て デ ー タ を 送 信 し 、 recv(2) recvfrom(2), recvmsg(2) は ソ ケ ッ ト か ら デ ー タ を 受 信 す る 。 poll(2)select(2) は デ ー タ の 到 着 を 待 っ た り 、 デ ー タ 送 信 の 準 備 が で き る ま で 待 っ た り す る 。 さ ら に 、 write(2), writev(2), sendfile(2), read(2), readv(2) の よ う な 標 準 的 な I/O 操 作 も デ ー タ の 読 み 書 き に 用 い る こ と が で き る 。

getsockbyname(2) は ロ ー カ ル の ソ ケ ッ ト ア ド レ ス を 返 し 、 getpeername(2) は リ モ ー ト の ソ ケ ッ ト ア ド レ ス を 返 す 。 getsockopt(2)setsockopt(2) は ソ ケ ッ ト 層 の オ プ シ ョ ン や プ ロ ト コ ル オ プ シ ョ ン の 取 得 ・ 設 定 に 用 い ら れ る 。 他 の い く つ か の オ プ シ ョ ン の 取 得 ・ 設 定 に は ioctl(2) を 使 う こ と が で き る 。

close(2) は ソ ケ ッ ト を ク ロ ー ズ す る 。 shutdown(2) は 全 二 重 な ソ ケ ッ ト 接 続 を 部 分 的 に ク ロ ー ズ す る 。 シ ー ク 動 作 や 、 0 以 外 の 位 置 に 対 す る pread(2)pwrite(2) は ソ ケ ッ ト で は サ ポ ー ト さ れ て い な い 。 非 ブ ロ ッ キ ン グ な I/O を ソ ケ ッ ト で 行 う こ と は 可 能 で 、 fcntl(2) を 使 っ て ソ ケ ッ ト の フ ァ イ ル デ ィ ス ク リ プ タ ー に O_NONBLOCK フ ラ グ を セ ッ ト す れ ば 良 い 。 こ う す る と ブ ロ ッ ク さ れ る 操 作 は 、 (通 常 ) EAGAIN エ ラ ー で 戻 る こ と に な る (後 で 処 理 が 再 試 行 さ れ る こ と が 期 待 さ れ て い る )。 connect(2) で は EINPROGRESS エ ラ ー が 返 さ れ る 。 こ の 場 合 、 ユ ー ザ ー は さ ま ざ ま な イ ベ ン ト を poll(2)select(2) を 使 っ て 待 つ こ と が で き る 。

poll(2)select(2) を 使 う 代 わ り に 、 カ ー ネ ル か ら ア プ リ ケ ー シ ョ ン に イ ベ ン ト を 通 知 さ せ る の に SIGIO シ グ ナ ル を 使 う 方 法 も あ る 。 こ の 方 法 を 使 う に は 、 fcntl(2) を 用 い て ソ ケ ッ ト の フ ァ イ ル デ ィ ス ク リ プ タ ー に O_ASYNC フ ラ グ を セ ッ ト し 、 SIGIO に 対 す る 有 効 な シ グ ナ ル ハ ン ド ラ ー を sigaction(2) に よ っ て 設 定 し て お く 必 要 が あ る 。 後 述 の シ グ ナ ル に 関 す る 議 論 も 参 考 に す る こ と 。 ソ ケ ッ ト ア ド レ ス 構 造 体 各 ソ ケ ッ ト ド メ イ ン に は そ れ ぞ れ 独 自 の ソ ケ ッ ト ア ド レ ス 形 式 が あ り 、 ド メ イ ン 固 有 の ア ド レ ス 構 造 体 を 持 っ て い る 。 こ れ ら の 構 造 体 の 先 頭 に は 、 ア ド レ ス 構 造 体 の 種 類 を 示 す 整 数 の "family" フ ィ ー ル ド (型 は sa_family_t) が あ る 。 こ の フ ィ ー ル ド に よ り 、 す べ て の ソ ケ ッ ト ド メ イ ン で 汎 用 的 に 使 用 さ れ る シ ス テ ム コ ー ル (例 え ば 、 connect(2), bind(2), accept(2), getsockname(2), getpeername(2) な ど ) が 、 特 定 の ソ ケ ッ ト ア ド レ ス の ド メ イ ン を 判 定 す る こ と が で き る 。 任 意 の 種 類 の ソ ケ ッ ト ア ド レ ス を ソ ケ ッ ト API の イ ン タ ー フ ェ ー ス に 渡 せ る よ う に 、 struct sockaddr 型 が 定 義 さ れ て い る 。 こ の 型 の 目 的 は 、 純 粋 に 、 ド メ イ ン 固 有 の ソ ケ ッ ト ア ド レ ス を 「 汎 用 的 な 」 型 に キ ャ ス ト で き る よ う に す る 点 に あ る 。 こ れ に よ り 、 ソ ケ ッ ト API 呼 び 出 し に お い て 、 コ ン パ イ ラ が 型 の 不 一 致 の 警 告 を 出 す の を 避 け る こ と が で き る 。 こ れ に 加 え て 、 ソ ケ ッ ト API で は デ ー タ 型 struct sockaddr_storage が 提 供 さ れ て い る 。 サ ポ ー ト し て い る す べ て の ド メ イ ン 固 有 の ソ ケ ッ ト ア ド レ ス 構 造 体 を 収 容 す る の に 、 こ の 型 を 使 う こ と が で き る 。 こ の 型 は 十 分 な 大 き さ が あ り 、 (メ モ リ ー 境 界 へ の ) ア ラ イ ン も 適 切 に 行 わ れ て い る (特 に 、 IPv6 ソ ケ ッ ト ア ド レ ス を 収 容 す る の に も 十 分 な 大 き さ で あ る )。 こ の 構 造 体 に は 次 の フ ィ ー ル ド が あ り 、 こ の フ ィ ー ル ド を 使 っ て 、 こ の 構 造 体 に 実 際 に 格 納 さ れ て い る ソ ケ ッ ト ア ド レ ス の 型 を 特 定 す る こ と が で き る 。

sa_family_t ss_family;

sockaddr_storage 構 造 体 は 、 ソ ケ ッ ト ア ド レ ス を 汎 用 的 な 方 法 で 扱 う 必 要 が あ る プ ロ グ ラ ム (例 え ば 、 IPv4 と IPv6 の 両 方 の ソ ケ ッ ト ア ド レ ス を 扱 う 必 要 が あ る プ ロ グ ラ ム ) で 有 用 で あ る 。 ソ ケ ッ ト オ プ シ ョ ン こ れ ら の ソ ケ ッ ト オ プ シ ョ ン は 、 setsockopt(2) を 用 い れ ば 設 定 で き 、 getsockopt(2) を 用 い れ ば 取 得 で き る 。 但 し 、 ど の ソ ケ ッ ト の 場 合 も ソ ケ ッ ト レ ベ ル に は SOL_SOCKET を 指 定 す る こ と 。 注 釈 が な い 限 り 、 optvalint へ の ポ イ ン タ ー で あ る 。
SO_ACCEPTCONN
こ の ソ ケ ッ ト が listen(2) に よ っ て 接 続 待 ち 受 け 状 態 に 設 定 さ れ て い る か ど う か を 示 す 値 を 返 す 。 値 0 は listen 状 態 の ソ ケ ッ ト で な い こ と を 、 値 1 は listen 状 態 の ソ ケ ッ ト で あ る こ と を 示 す 。 こ の ソ ケ ッ ト オ プ シ ョ ン は 読 み 込 み 専 用 で あ る 。
SO_BINDTODEVICE
こ の ソ ケ ッ ト を 、 引 き 数 で 渡 し た イ ン タ ー フ ェ ー ス 名 で 指 定 さ れ る (“eth0” の よ う な ) 特 定 の デ バ イ ス に バ イ ン ド す る 。 名 前 が 空 文 字 列 だ っ た り 、 オ プ シ ョ ン の 長 さ (optlen) が 0 の 場 合 に は 、 ソ ケ ッ ト の バ イ ン ド が 削 除 さ れ る 。 渡 す オ プ シ ョ ン は 、 イ ン タ ー フ ェ ー ス 名 が 入 っ た ヌ ル 文 字 で 終 端 さ れ た 可 変 長 の 文 字 列 で あ る 。 文 字 列 の 最 大 の サ イ ズ は IFNAMSIX で あ る 。 ソ ケ ッ ト が イ ン タ ー フ ェ ー ス に バ イ ン ド さ れ る と 、 そ の 特 定 の イ ン タ ー フ ェ ー ス か ら 受 信 さ れ た パ ケ ッ ト だ け を 処 理 す る 。 こ の オ プ シ ョ ン は い く つ か の ソ ケ ッ ト タ イ プ 、 特 に AF_INET に 対 し て の み 動 作 す る 点 に 注 意 す る こ と 。 パ ケ ッ ト ソ ケ ッ ト で は サ ポ ー ト さ れ て い な い (通 常 の bind(2) を 使 う こ と )。

Linux 3.8 よ り 前 の バ ー ジ ョ ン で は 、 こ の ソ ケ ッ ト オ プ シ ョ ン は getsockname(2) で 設 定 す る こ と は で き た が 、 取 得 す る こ と が で き な か っ た 。 Linux 3.8 以 降 で は 、 読 み 出 す こ と が で き る 。 optlen 引 き 数 に は 、 デ バ イ ス 名 を 格 納 す る の に 十 分 な バ ッ フ ァ ー サ イ ズ を 渡 す べ き で あ り 、 IFNAMSIZ バ イ ト に す る こ と を 推 奨 す る 。 実 際 の デ バ イ ス 名 の 長 さ は optlen 引 き 数 に 格 納 さ れ て 返 さ れ る 。

SO_BROADCAST ブ ロ ー ド キ ャ ス ト フ ラ グ を 設 定 ・ 取 得 す る 。 有 効 に な っ て い る と 、 デ ー タ グ ラ ム ソ ケ ッ ト は ブ ロ ー ド キ ャ ス ト ア ド レ ス に パ ケ ッ ト を 送 信 で き る よ う に な る 。 ス ト リ ー ム 指 向 の ソ ケ ッ ト に は 何 の 効 果 も な い 。
SO_BSDCOMPAT

BSD の バ グ に 対 し て 互 換 性 を 取 る た め の 機 能 を 有 効 に す る 。 こ の 機 能 は Linux 2.0 と 2.2 の UDP プ ロ ト コ ル モ ジ ュ ー ル で 使 用 さ れ て い る 。 有 効 に な っ て い る と 、 UDP ソ ケ ッ ト で 受 信 さ れ た ICMP エ ラ ー は ユ ー ザ ー プ ロ グ ラ ム に 渡 さ れ な い 。 こ れ 以 降 の バ ー ジ ョ ン の カ ー ネ ル で は 、 こ の オ プ シ ョ ン の サ ポ ー ト は 段 階 的 に 廃 止 さ れ て き た 。 Linux 2.4 で は こ の オ プ シ ョ ン は 黙 っ て 無 視 さ れ 、 Linux 2.6 で は プ ロ グ ラ ム が こ の オ プ シ ョ ン を 使 用 す る と (printk() を 使 っ て ) カ ー ネ ル の 警 告 メ ッ セ ー ジ が 出 力 さ れ る 。 Linux 2.0 で は 、 こ の オ プ シ ョ ン を 指 定 す る と 、 raw ソ ケ ッ ト に お い て も BSD の バ グ (ラ ン ダ ム ヘ ッ ダ ー 変 更 、 ブ ロ ー ド キ ャ ス ト フ ラ グ の ス キ ッ プ ) に 対 す る 互 換 機 能 が 有 効 に な っ て い た 。 し か し 、 こ ち ら は Linux 2.2 で 削 除 さ れ た 。

SO_DEBUG ソ ケ ッ ト の デ バ ッ グ 機 能 を 有 効 に す る 。 CAP_NET_ADMIN 権 限 を 持 つ プ ロ セ ス か 、 実 効 ユ ー ザ ー ID が 0 の プ ロ セ ス で し か 利 用 で き な い 。
SO_DOMAIN
(Linux 2.6.32 以 降 ) ソ ケ ッ ト ド メ イ ン を 整 数 で 取 得 す る 。 AF_INET6 の よ う な 値 が 返 さ れ る 。 詳 細 は socket(2) を 参 照 。 こ の ソ ケ ッ ト オ プ シ ョ ン は 読 み 込 み 専 用 で あ る 。
SO_ERROR
保 留 に な っ て い た ソ ケ ッ ト エ ラ ー を 取 得 し て ク リ ア す る 。 こ の ソ ケ ッ ト オ プ シ ョ ン は 読 み 込 み 専 用 で あ る 。 整 数 値 を と る 。
SO_DONTROUTE
ゲ ー ト ウ ェ イ を 経 由 せ ず 、 直 接 接 続 さ れ て い る ホ ス ト に の み 送 信 す る 。 send(2) 操 作 で MSG_DONTROUTE フ ラ グ を セ ッ ト し た 場 合 も 同 じ 効 果 が 得 ら れ る 。 ブ ー ル 整 数 の フ ラ グ を 取 る 。
SO_KEEPALIVE
接 続 志 向 の ソ ケ ッ ト に 対 す る keep−alive メ ッ セ ー ジ の 送 信 を 有 効 に す る 。 ブ ー ル 値 の 整 数 フ ラ グ を と る 。
SO_LINGER

SO_LINGER オ プ シ ョ ン を 取 得 ・ 設 定 す る 。 引 き 数 に は linger 構 造 体 を 取 る 。

struct linger {
int l_onoff; /* linger active */
int l_linger; /* how many seconds to linger for */ }; 有 効 に な っ て い る と 、 close(2)shutdown(2) は 、 そ の ソ ケ ッ ト に キ ュ ー イ ン グ さ れ た メ ッ セ ー ジ が す べ て 送 信 完 了 す る か 、 linger (居 残 り ) タ イ ム ア ウ ト に な る ま で 返 ら な い 。 無 効 に な っ て い る と 、 こ れ ら の コ ー ル は た だ ち に 戻 り 、 ク ロ ー ズ 動 作 は バ ッ ク グ ラ ウ ン ド で 行 わ れ る 。 ソ ケ ッ ト の ク ロ ー ズ を exit(2) の 一 部 と し て 行 っ た 場 合 に は 、 残 っ て い る ソ ケ ッ ト の ク ロ ー ズ 動 作 は 必 ず バ ッ ク グ ラ ウ ン ド に 送 ら れ る 。

SO_MARK (Linux 2.6.25 以 降 ) こ の ソ ケ ッ ト か ら 送 信 さ れ る 各 パ ケ ッ ト に マ ー ク を セ ッ ト す る (netfilter の MARK タ ー ゲ ッ ト と 似 て い る が 、 ソ ケ ッ ト 単 位 で あ る 点 が 異 な る )。 マ ー ク の 変 更 は 、 netfilter な し で の マ ー ク に 基 づ い て の ル ー テ ィ ン グ や 、 パ ケ ッ ト フ ィ ル タ リ ン グ に 使 う こ と が で き る 。 こ の オ プ シ ョ ン を 変 更 す る に は CAP_NET_ADMIN ケ ー パ ビ リ テ ィ が 必 要 で あ る 。
SO_OOBINLINE
こ の オ プ シ ョ ン を 有 効 に す る と 、 帯 域 外 デ ー タ (out−of−band data) は 受 信 デ ー タ ス ト リ ー ム 中 に 置 か れ る 。 有 効 に し な け れ ば 、 帯 域 外 デ ー タ は 受 信 時 に MSG_OOB フ ラ グ が セ ッ ト さ れ て い る 場 合 に 限 っ て 渡 さ れ る 。
SO_PASSCRED

SCM_CREDENTIALS 制 御 メ ッ セ ー ジ の 受 信 を 有 効 /無 効 に す る 。 詳 細 は unix(7) を 参 照 の こ と 。

SO_PEEK_OFF (Linux 3.4 以 降 )

MSG_PEEK フ ラ グ と 一 緒 に 使 用 さ れ た 場 合 recv(2) シ ス テ ム コ ー ル の "peek offset" に こ の オ プ シ ョ ン の 値 が 設 定 さ れ る 。 現 在 の と こ ろ 、 こ の オ プ シ ョ ン は unix(7) ソ ケ ッ ト で の み サ ポ ー ト さ れ て い る 。 こ の オ プ シ ョ ン が 負 の 値 に 設 定 さ れ た 場 合 、 従 来 の 動 作 と な る 。 つ ま り MSG_PEEK フ ラ グ が 指 定 さ れ た recv(2) は 、 キ ュ ー の 先 頭 の デ ー タ に 対 し て peek 処 理 を 行 う (デ ー タ を 読 み 出 す が 、 キ ュ ー か ら デ ー タ の 削 除 を 行 わ な い )。 新 規 の ソ ケ ッ ト で は こ の オ プ シ ョ ン の 値 は 必 ず −1 に 設 定 さ れ る 。 こ の オ プ シ ョ ン に 0 以 上 の 値 が 設 定 さ れ る と 、 そ の ソ ケ ッ ト の キ ュ ー 上 の オ プ シ ョ ン 値 で 指 定 さ れ た バ イ ト オ フ セ ッ ト に あ る デ ー タ が 次 の peek 処 理 で 返 さ れ る 。 同 時 に 、 "peek offset" が キ ュ ー か ら peek 処 理 さ れ た バ イ ト 数 だ け 加 算 さ れ る 。 し た が っ て 、 次 の peek 処 理 で は キ ュ ー の そ の 次 に あ る デ ー タ が 返 さ れ る 。

recv(2) (や 同 様 の シ ス テ ム コ ー ル ) の MSG_PEEK フ ラ グ な し の 呼 び 出 し で キ ュ ー の 先 頭 の デ ー タ が 削 除 さ れ た 場 合 、 "peek offset" は 削 除 さ れ た バ イ ト 数 だ け 減 算 さ れ る 。 言 い 換 え る と 、 MSG_PEEK フ ラ グ な し で デ ー タ を 受 信 す る と 、 "peek offset" が 指 す キ ュ ー 内 の 相 対 的 な 位 置 が 狂 わ な い よ う に 調 整 さ れ 、 こ の 後 の peek で は 、 デ ー タ 削 除 が 行 わ れ な か っ た 場 合 に 返 さ れ た の と 同 じ 値 が 返 さ れ る と い う こ と で あ る 。 デ ー タ グ ラ ム ソ ケ ッ ト で は 、 "peek offset" が パ ケ ッ ト の 途 中 を 指 し て い る 場 合 に は 、 返 さ れ る デ ー タ に は MSG_TRUNC フ ラ グ が 付 与 さ れ る 。 以 下 の 例 は SO_PEEK_OFF の 利 用 例 を 示 し て い る 。 ス ト リ ー ム ソ ケ ッ ト の キ ュ ー に 以 下 の 入 力 デ ー タ が 入 っ て い る も の と す る 。

aabbccddeeff 以 下 の 順 序 で recv(2) の 呼 び 出 し を 行 う と 、 コ メ ン ト に 書 か れ た 結 果 と な る 。

int ov = 4; // Set peek offset to 4
setsockopt(fd, SOL_SOCKET, SO_PEEK_OFF, &ov, sizeof(ov));

recv(fd, buf, 2, MSG_PEEK); // Peeks "cc"; offset set to 6
recv(fd, buf, 2, MSG_PEEK); // Peeks "dd"; offset set to 8
recv(fd, buf, 2, 0); // Reads "aa"; offset set to 6
recv(fd, buf, 2, MSG_PEEK); // Peeks "ee"; offset set to 8

SO_PEERCRED こ の ソ ケ ッ ト に 接 続 し て き た 外 部 プ ロ セ ス の 信 任 状 (credential) を 返 す 。 こ の ソ ケ ッ ト オ プ シ ョ ン が 利 用 で き る の は 、 接 続 さ れ た AF_UNIX ス ト リ ー ム ソ ケ ッ ト 間 、 お よ び socketpair(2) を 使 っ て 作 成 さ れ た AF_UNIX の ス ト リ ー ム ソ ケ ッ ト と デ ー タ グ ラ ム ソ ケ ッ ト の ペ ア だ け で あ る 。 unix(7) を 参 照 の こ と 。 connect(2)socketpair(2) が 呼 ば れ た 時 に 有 効 で あ っ た 信 任 状 が 返 さ れ る 。 引 き 数 は ucred 構 造 体 で あ る 。 こ の 構 造 体 の 定 義 を <sys/socket.h> を 得 る に は 、 機 能 検 査 マ ク ロ _GNU_SOURCE を 定 義 す る こ と 。 こ の ソ ケ ッ ト オ プ シ ョ ン は 読 み 込 み 専 用 で あ る 。
SO_PRIORITY
プ ロ ト コ ル で 定 義 さ れ た 優 先 度 を 、 こ の ソ ケ ッ ト か ら 送 信 さ れ る 全 て の パ ケ ッ ト に セ ッ ト す る 。 Linux は ネ ッ ト ワ ー ク キ ュ ー 内 部 の 整 列 に こ の 値 を 用 い る 。 高 い 優 先 度 を 持 っ て い る パ ケ ッ ト は 先 に 処 理 さ れ る 。 た だ し そ の デ バ イ ス の キ ュ ー 処 理 の や り 方 に 依 存 す る 。 ip(7) で は 、 外 向 け パ ケ ッ ト の IP type−of−service (TOS) フ ィ ー ル ド に も こ の 値 が 設 定 さ れ る 。 0 か ら 6 以 外 の 優 先 度 を セ ッ ト す る に は CAP_NET_ADMIN ケ ー パ ビ リ テ ィ が 必 要 で あ る 。
SO_PROTOCOL
(Linux 2.6.32 以 降 ) ソ ケ ッ ト の プ ロ ト コ ル を 整 数 で 取 得 す る 。 IPPROTO_SCTP の よ う な 値 が 返 さ れ る 。 詳 細 は socket(2) を 参 照 。 こ の ソ ケ ッ ト オ プ シ ョ ン は 読 み 込 み 専 用 で あ る 。
SO_RCVBUF
ソ ケ ッ ト の 受 信 バ ッ フ ァ ー の 最 大 サ イ ズ を 設 定 ・ 取 得 す る (バ イ ト 単 位 )。 setsockopt(2) を 使 っ て 値 が 設 定 さ れ た と き に (管 理 オ ー バ ヘ ッ ド 用 の 領 域 を 確 保 す る た め に ) カ ー ネ ル は こ の 値 を 2倍 し 、 getsockopt(2) は こ の 2倍 さ れ た 値 を 返 す 。 デ フ ォ ル ト の 値 は /proc/sys/net/core/rmem_default フ ァ イ ル で 設 定 さ れ 、 許 容 さ れ る 最 大 の 値 は /proc/sys/net/core/rmem_max フ ァ イ ル で 設 定 さ れ る 。 こ の オ プ シ ョ ン の 最 小 値 は (2倍 し た 値 で ) 256 で あ る 。
SO_RCVBUFFORCE
(Linux 2.6.14 以 降 ) こ の ソ ケ ッ ト オ プ シ ョ ン を 使 う と 、 特 権 プ ロ セ ス (CAP_NET_ADMIN を 持 つ プ ロ セ ス ) は SO_RCVBUF と 同 じ こ と を 実 行 で き る 。 た だ し 、 上 限 rmem_max を 上 書 き す る こ と が で き る 。
SO_RCVLOWAT
SO_SNDLOWAT バ ッ フ ァ ー 中 に 溜 め る こ と の で き る デ ー タ の 最 小 値 を 指 定 す る 。 こ の サ イ ズ を 越 え る と 、 ソ ケ ッ ト 層 は そ の デ ー タ を プ ロ ト コ ル に 渡 し (SO_SNDLOWAT)、 受 信 時 に は ユ ー ザ ー に 渡 す (SO_RCVLOWAT)。 こ れ ら 二 つ の 値 は 1 に 初 期 化 さ れ る 。 SO_SNDLOWAT は Linux で は 変 更 で き な い (setsockopt(2) は ENOPROTOOPT エ ラ ー で 失 敗 す る )。 SO_RCVLOWAT は Linux 2.4 以 降 で の み 変 更 可 能 で あ る 。 現 状 、 Linux で は シ ス テ ム コ ー ル select(2)poll(2)SO_RCVLOWAT の 設 定 を 考 慮 に 入 れ ず に 動 作 し 、 デ ー タ が 1バ イ ト 利 用 可 能 に な っ た だ け で も 、 ソ ケ ッ ト は 読 み 出 し 可 能 と の マ ー ク を つ け る 。 一 方 、 そ れ に 続 け て 行 う ソ ケ ッ ト か ら の read は SO_RCVLOWAT バ イ ト の デ ー タ が 利 用 可 能 に な る ま で 停 止 し て し ま う 。
SO_RCVTIMEO
SO_SNDTIMEO 送 信 ・ 受 信 の タ イ ム ア ウ ト を 指 定 す る 。 こ れ を 越 え る と エ ラ ー を 報 告 す る 。 引 き 数 は struct timeval で あ る 。 入 出 力 関 数 が タ イ ム ア ウ ト 時 間 の 間 ブ ロ ッ ク さ れ 、 か つ デ ー タ の 送 信 ま た は 受 信 が 行 わ れ て い た 場 合 は 、 転 送 さ れ た デ ー タ 量 が 関 数 の 返 り 値 と な る 。 何 も デ ー タ が 転 送 さ れ ず に タ イ ム ア ウ ト に 達 し た 場 合 は 、 −1 を 返 し 、 errnoEAGAINEWOULDBLOCKEINPROGRESS (connect(2) の 場 合 ) が 設 定 さ れ 、 あ た か も ソ ケ ッ ト に 非 ブ ロ ッ キ ン グ が 指 定 さ れ た よ う に 見 え る 。 タ イ ム ア ウ ト 値 に (デ フ ォ ル ト 値 で あ る ) 0 に 設 定 す る と 、 操 作 は 決 し て タ イ ム ア ウ ト し な く な る 。 タ イ ム ア ウ ト が 影 響 を 及 ぼ す の は 、 ソ ケ ッ ト I/O を 実 行 す る シ ス テ ム コ ー ル だ け (例 え ば read(2), recvmsg(2), send(2), sendmsg(2)) で あ る 。 select(2), poll(2), epoll_wait(2) な ど に は タ イ ム ア ウ ト は 影 響 を 及 ぼ さ な い 。
SO_REUSEADDR

bind(2) コ ー ル に 与 え ら れ た ア ド レ ス が 正 し い か を 判 断 す る ル ー ル で 、 ロ ー カ ル ア ド レ ス の 再 利 用 を 可 能 に す る 。 つ ま り AF_INET ソ ケ ッ ト な ら 、 そ の ア ド レ ス に バ イ ン ド さ れ た ア ク テ ィ ブ な listen 状 態 の ソ ケ ッ ト が 存 在 し な い 限 り 、 バ イ ン ド が 行 え る 。 listen 状 態 の ソ ケ ッ ト が ア ド レ ス INADDR_ANY で 特 定 の ポ ー ト に バ イ ン ド さ れ て い る 場 合 に は 、 こ の ポ ー ト に 対 し て は 、 ど ん な ロ ー カ ル ア ド レ ス で も バ イ ン ド で き な い 。 引 き 数 は ブ ー ル 整 数 の フ ラ グ で あ る 。

SO_RXQ_OVFL (Linux 2.6.33 以 降 ) 最 後 の 受 信 パ ケ ッ ト と こ の 受 信 パ ケ ッ ト の 間 に そ の ソ ケ ッ ト で 捨 て ら れ た (ド ロ ッ プ さ れ た ) パ ケ ッ ト 数 を 示 す 、 unsigned 32 ビ ッ ト 値 の 補 助 メ ッ セ ー ジ (cmsg) を 受 信 し た skb に 付 与 す る こ と を 指 示 す る 。
SO_SNDBUF
ソ ケ ッ ト の 送 信 バ ッ フ ァ ー の 最 大 サ イ ズ を 設 定 ・ 取 得 す る (バ イ ト 単 位 )。 setsockopt(2) を 使 っ て 値 が 設 定 さ れ た と き に (管 理 オ ー バ ヘ ッ ド 用 の 領 域 を 確 保 す る た め に ) カ ー ネ ル は こ の 値 を 2倍 し 、 getsockopt(2) は こ の 2倍 さ れ た 値 を 返 す 。 デ フ ォ ル ト の 値 は /proc/sys/net/core/wmem_default フ ァ イ ル で 設 定 さ れ 、 許 容 さ れ る 最 大 の 値 は /proc/sys/net/core/wmem_max フ ァ イ ル で 設 定 さ れ る 。 こ の オ プ シ ョ ン の 最 小 値 は (2倍 し た 値 で ) 2048 で あ る 。
SO_SNDBUFFORCE
(Linux 2.6.14 以 降 ) こ の ソ ケ ッ ト オ プ シ ョ ン を 使 う と 、 特 権 プ ロ セ ス (CAP_NET_ADMIN を 持 つ プ ロ セ ス ) は SO_SNDBUF と 同 じ こ と を 実 行 で き る 。 た だ し 、 上 限 wmem_max を 上 書 き す る こ と が で き る 。
SO_TIMESTAMP

SO_TIMESTAMP 制 御 メ ッ セ ー ジ の 受 信 を 有 効 /無 効 に す る 。 タ イ ム ス タ ン プ 制 御 メ ッ セ ー ジ は レ ベ ル SOL_SOCKET で 送 信 さ れ 、 cmsg_data フ ィ ー ル ド は こ の シ ス テ ム コ ー ル で ユ ー ザ ー に 渡 し た 最 後 の パ ケ ッ ト の 受 信 時 刻 を 示 す struct timeval で あ る 。 制 御 メ ッ セ ー ジ の 詳 細 に つ い て は cmsg(3) を 参 照 。

SO_TYPE ソ ケ ッ ト の タ イ プ を 整 数 で 取 得 す る (例 : SOCK_STREAM)。 こ の ソ ケ ッ ト オ プ シ ョ ン は 読 み 出 し 専 用 で あ る 。
SO_BUSY_POLL
(Linux 3.11 以 降 ) デ ー タ が な か っ た 際 に ブ ロ ッ キ ン グ 受 信 で の busy polling の お お よ そ の 時 間 を マ イ ク ロ 秒 単 位 で 設 定 す る 。 こ の 値 を 増 や す に は CAP_NET_ADMIN ケ ー パ ビ リ テ ィ が 必 要 で あ る 。 こ の オ プ シ ョ ン の デ フ ォ ル ト 値 は /proc/sys/net/core/busy_read で 制 御 で き る 。

/proc/sys/net/core/busy_poll の 値 に よ り 、 SO_BUSY_POLL が セ ッ ト さ れ た ソ ケ ッ ト に 対 し て select(2)poll(2) を 行 い 、 報 告 す べ き イ ベ ン ト が な い 場 合 に 、 select(2)poll(2) が busy polling を ど の く ら い の 時 間 行 う か が 決 ま る 。 ど ち ら の 場 合 も 、 busy polling は 、 そ の ソ ケ ッ ト が 最 後 に デ ー タ を 受 信 し た ネ ッ ト ワ ー ク デ バ イ ス が こ の オ プ シ ョ ン に 対 応 し て い る 場 合 の み 行 わ れ る 。

busy polling に よ り 遅 延 が 改 善 さ れ る は ア プ リ ケ ー シ ョ ン も あ る が 、 busy polling は CPU 使 用 率 と 電 力 使 用 量 を と も に 増 加 さ せ る こ と に な る の で 、 使 用 す る 際 は 注 意 し て 行 う こ と 。 シ グ ナ ル

(ロ ー カ ル も し く は リ モ ー ト 側 で ) 切 断 さ れ た 接 続 指 向 (connection−oriented) の ソ ケ ッ ト に 対 し て 書 き 込 み を 行 う と 、 そ の 書 き 込 み を 行 っ た プ ロ セ ス に SIGPIPE が 送 ら れ 、 EPIPE が 返 さ れ る 。 write 呼 び 出 し に MSG_NOSIGNAL フ ラ グ を 指 定 し て い た 場 合 は シ グ ナ ル は 送 ら れ な い 。

FIOSETOWN fcntl(2)SIOCSPGRP ioctl(2) を プ ロ セ ス ま た は プ ロ セ ス グ ル ー プ に 指 定 し て お く と 、 I/O イ ベ ン ト が 起 き た と き に SIGIO が 送 ら れ る 。 poll(2)select(2) を シ グ ナ ル ハ ン ド ラ ー 内 で 用 い れ ば 、 ど の ソ ケ ッ ト で イ ベ ン ト が 起 こ っ た か を 知 る こ と が で き る 。 (Linux 2.2 に お け る ) 別 の 方 法 と し て は 、 F_SETSIG fcntl(2) を 用 い て リ ア ル タ イ ム シ グ ナ ル を 設 定 す る や り 方 も あ る 。 リ ア ル タ イ ム シ グ ナ ル の ハ ン ド ラ ー は 、 siginfo_tsi_fd フ ィ ー ル ド に フ ァ イ ル デ ィ ス ク リ プ タ ー が 入 っ た 状 態 で 呼 び 出 さ れ る 。 詳 細 は fcntl(2) を 参 照 の こ と 。 状 況 に よ っ て は (例 え ば 複 数 の プ ロ セ ス が 一 つ の ソ ケ ッ ト に ア ク セ ス し て い る な ど )、 SIGIO の 原 因 と な っ た 状 態 は 、 プ ロ セ ス が そ の シ グ ナ ル へ の 対 応 を 行 っ た と き に は 消 え て し ま っ て い る か も し れ な い 。 こ の 場 合 は 、 プ ロ セ ス は 再 び 待 つ よ う に す べ き で あ る 。 Linux は 同 じ シ グ ナ ル を 後 で 再 送 す る か ら で あ る 。

/proc イ ン タ ー フ ェ ー ス
core の ソ ケ ッ ト の ネ ッ ト ワ ー キ ン グ パ ラ メ ー タ ー に は 、 /proc/sys/net/core/ デ ィ レ ク ト リ 内 の フ ァ イ ル を 通 し て ア ク セ ス で き る 。
rmem_default
ソ ケ ッ ト の 受 信 バ ッ フ ァ ー サ イ ズ の デ フ ォ ル ト 値 (バ イ ト 単 位 )。
rmem_max

SO_RCVBUF ソ ケ ッ ト オ プ シ ョ ン を 用 い て ユ ー ザ ー が 設 定 で き る ソ ケ ッ ト の 受 信 バ ッ フ ァ ー サ イ ズ の 最 大 値 (バ イ ト 単 位 )。

wmem_default ソ ケ ッ ト の 送 信 バ ッ フ ァ ー サ イ ズ の デ フ ォ ル ト 値 (バ イ ト 単 位 )。
wmem_max

SO_SNDBUF ソ ケ ッ ト オ プ シ ョ ン を 用 い て ユ ー ザ ー が 設 定 で き る ソ ケ ッ ト の 送 信 バ ッ フ ァ ー サ イ ズ の 最 大 値 (バ イ ト 単 位 )。

message_costmessage_burst ト ー ク ン バ ケ ッ ト フ ィ ル タ ー を 設 定 す る 。 こ れ は 外 部 の ネ ッ ト ワ ー ク イ ベ ン ト に よ っ て 引 き 起 こ さ れ た 負 荷 限 界 の 警 告 メ ッ セ ー ジ に 用 い ら れ る 。
netdev_max_backlog
グ ロ ー バ ル な 入 力 キ ュ ー に お け る 最 大 の パ ケ ッ ト 数 。
optmem_max
ソ ケ ッ ト あ た り の 、 補 助 デ ー タ (ancillary data) と ユ ー ザ ー 制 御 デ ー タ (iovecs の よ う な も の ) と の 和 の 最 大 長 。

ioctl 以 下 に 示 す 操 作 に は ioctl(2) を 用 い て ア ク セ ス で き る 。

error = ioctl(ip_socket, ioctl_type, &value_result);

SIOCGSTAMP 最 後 に ユ ー ザ ー に 渡 さ れ た パ ケ ッ ト の 受 信 タ イ ム ス タ ン プ を struct timeval に 入 れ て 返 す 。 こ れ は round trip 時 間 を 正 確 に 測 り た い と き に 便 利 で あ る 。 struct timeval の 説 明 は setitimer(2) を 見 て ほ し い 。 こ の ioctl は 、 ソ ケ ッ ト オ プ シ ョ ン SO_TIMESTAMP が ソ ケ ッ ト に セ ッ ト さ れ て い な い 場 合 に の み 使 用 す べ き で あ る 。 さ も な け れ ば 、 こ の ioctl は SO_TIMESTAMP が セ ッ ト さ れ て い な か っ た 間 に 受 信 し た 最 後 の パ ケ ッ ト の 時 刻 を 返 す か 、 そ の よ う な パ ケ ッ ト を 受 信 し て い な い 場 合 に は 失 敗 す る (つ ま り 、 ioctl(2) は −1 を 返 し 、 errnoENOENT を セ ッ ト す る )。
SIOCSPGRP
非 同 期 I/O 操 作 の 終 了 時 や 緊 急 デ ー タ の 受 信 時 に SIGIOSIGURG シ グ ナ ル 群 を 送 る プ ロ セ ス や プ ロ セ ス グ ル ー プ を 設 定 す る 。 引 き 数 は pid_t へ の ポ イ ン タ ー で あ る 。 引 き 数 が 正 だ と 、 そ の プ ロ セ ス に シ グ ナ ル が 送 ら れ る 。 負 だ と 、 引 き 数 の 絶 対 値 を ID に 持 つ プ ロ セ ス グ ル ー プ に シ グ ナ ル が 送 ら れ る 。 シ グ ナ ル 受 信 先 に は 、 自 分 自 身 の プ ロ セ ス / 自 分 の 所 属 す る プ ロ セ ス グ ル ー プ し か 指 定 で き な い 。 但 し 、 CAP_KILL ケ ー パ ビ リ テ ィ を 持 っ て い る 場 合 、 及 び 実 効 ユ ー ザ ー ID が 0 の プ ロ セ ス の 場 合 は こ の 限 り で は な い 。
FIOASYNC

O_ASYNC フ ラ グ を 変 更 し 、 ソ ケ ッ ト の 非 同 期 (asynchronous) I/O モ ー ド を 有 効 /無 効 に す る 。 非 同 期 I/O モ ー ド で は 、 新 し い I/O イ ベ ン ト が 起 き た と き に 、 SIGIO シ グ ナ ル や F_SETSIG で 設 定 さ れ た シ グ ナ ル セ ッ ト が 発 行 さ れ る 。 引 き 数 は ブ ー ル 整 数 の フ ラ グ で あ る 。 (こ の 操 作 は fcntl(2) を 使 っ て O_ASYNC フ ラ グ を セ ッ ト す る の と 同 じ 意 味 で あ る 。 )

SIOCGPGRP

SIGIOSIGURG を 受 信 し た カ レ ン ト プ ロ セ ス か プ ロ セ ス グ ル ー プ を 取 得 す る 。 な い 場 合 は 0 が 返 る 。 有 効 な fcntl(2) 操 作 :

FIOGETOWN

SIOCGPGRP ioctl(2) と 同 じ 。

FIOSETOWN

SIOCSPGRP ioctl(2) と 同 じ 。

バ ー ジ ョ ン

SO_BINDTODEVICE は Linux 2.0.30 で 導 入 さ れ た 。 SO_PASSCRED は Linux 2.2 で 登 場 し た 。 /proc イ ン タ ー フ ェ ー ス は Linux 2.2 で 導 入 さ れ た 。 SO_RCVTIMEOSO_SNDTIMEO は Linux 2.3.41 以 降 で サ ポ ー ト さ れ て い る 。 そ れ 以 前 は 、 タ イ ム ア ウ ト は プ ロ ト コ ル 固 有 の 固 定 の 設 定 値 で 、 読 み 書 き を す る こ と は で き な か っ た 。

注 意

Linux は 、 送 受 信 バ ッ フ ァ ー の 半 分 を 内 部 の カ ー ネ ル 構 造 体 で 用 い る と 仮 定 し て い る 。 し た が っ て 、 対 応 す る /proc フ ァ イ ル は ネ ッ ト ワ ー ク 回 線 上 で の 大 き さ の 2 倍 に な る 。

Linux で は 、 SO_REUSEADDR オ プ シ ョ ン で ポ ー ト の 再 利 用 が 許 可 さ れ る の は 、 そ の ポ ー ト に 対 し て bind(2) を 前 に 実 行 し た プ ロ グ ラ ム と そ の ポ ー ト を 再 利 用 し よ う と す る プ ロ グ ラ ム の 両 方 で SO_REUSEADDR が セ ッ ト さ れ た 場 合 の み で あ る 。 こ の 動 作 は (FreeBSD な ど の ) い く つ か の 実 装 と は 異 な る 。 こ れ ら で は 、 後 で ポ ー ト を 再 利 用 し よ う と す る プ ロ グ ラ ム で SO_REUSEADDR オ プ シ ョ ン を セ ッ ト す る だ け で よ い 。 た い て い は こ の 違 い は 見 え な い 。 な ぜ な ら 、 例 え ば サ ー バ プ ロ グ ラ ム は 常 に こ の オ プ シ ョ ン を セ ッ ト す る よ う に 設 計 さ れ る か ら で あ る 。

バ グ

CONFIG_FILTER ソ ケ ッ ト オ プ シ ョ ン で あ る SO_ATTACH_FILTERSO_DETACH_FILTER に つ い て 記 載 さ れ て い な い 。 こ れ ら は libpcap ラ イ ブ ラ リ を 通 し て 用 い る 方 が 良 い 。

関 連 項 目

connect(2), getsockopt(2), setsockopt(2), socket(2), capabilities(7), ddp(7), ip(7), packet(7), tcp(7), udp(7), unix(7)

こ の 文 書 に つ い て

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

COMMENTS