名 前
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 を 指 定 す
る こ と 。 注 釈
が な い 限 り 、
optval は int へ の ポ
イ ン タ ー で あ
る 。
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 を
返 し 、 errno に
EAGAIN か EWOULDBLOCK か
EINPROGRESS (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_t の si_fd フ ィ ー ル ド に フ ァ イ ル デ ィ ス ク リ プ タ ー が 入 っ た 状 態 で 呼 び 出 さ れ る 。 詳 細 は fcntl(2) を 参 照 の こ と 。 状 況 に よ っ て は (例 え ば 複 数 の プ ロ セ ス が 一 つ の ソ ケ ッ ト に ア ク セ ス し て い る な ど )、 SIGIO の 原 因 と な っ た 状 態 は 、 プ ロ セ ス が そ の シ グ ナ ル へ の 対 応 を 行 っ た と き に は 消 え て し ま っ て い る か も し れ な い 。 こ の 場 合 は 、 プ ロ セ ス は 再 び 待 つ よ う に す べ き で あ る 。 Linux は 同 じ シ グ ナ ル を 後 で 再 送 す る か ら で あ る 。
/proc
イ ン タ ー フ ェ
ー ス
core の ソ ケ ッ ト の
ネ ッ ト ワ ー キ
ン グ パ ラ メ ー
タ ー に は 、
/proc/sys/net/core/ デ ィ レ
ク ト リ 内 の フ
ァ イ ル を 通 し
て ア ク セ ス で
き る 。
rmem_default ソ ケ ッ ト
の 受 信 バ ッ フ
ァ ー サ イ ズ の
デ フ ォ ル ト 値
(バ イ ト 単 位 )。
rmem_max
SO_RCVBUF ソ ケ ッ ト オ プ シ ョ ン を 用 い て ユ ー ザ ー が 設 定 で き る ソ ケ ッ ト の 受 信 バ ッ フ ァ ー サ イ ズ の 最 大 値 (バ イ ト 単 位 )。
wmem_default ソ
ケ ッ ト の 送 信
バ ッ フ ァ ー サ
イ ズ の デ フ ォ
ル ト 値 (バ イ ト
単 位 )。
wmem_max
SO_SNDBUF ソ ケ ッ ト オ プ シ ョ ン を 用 い て ユ ー ザ ー が 設 定 で き る ソ ケ ッ ト の 送 信 バ ッ フ ァ ー サ イ ズ の 最 大 値 (バ イ ト 単 位 )。
message_cost と
message_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 を 返 し
、 errno に ENOENT を
セ ッ ト す る )。
SIOCSPGRP 非 同 期 I/O 操
作 の 終 了 時 や
緊 急 デ ー タ の
受 信 時 に SIGIO や
SIGURG シ グ ナ ル 群
を 送 る プ ロ セ
ス や プ ロ セ ス
グ ル ー プ を 設
定 す る 。 引 き
数 は 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
SIGIO や SIGURG を 受 信 し た カ レ ン ト プ ロ セ ス か プ ロ セ ス グ ル ー プ を 取 得 す る 。 な い 場 合 は 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_RCVTIMEO と SO_SNDTIMEO は Linux 2.3.41 以 降 で サ ポ ー ト さ れ て い る 。 そ れ 以 前 は 、 タ イ ム ア ウ ト は プ ロ ト コ ル 固 有 の 固 定 の 設 定 値 で 、 読 み 書 き を す る こ と は で き な か っ た 。
注 意
Linux は 、 送 受 信 バ ッ フ ァ ー の 半 分 を 内 部 の カ ー ネ ル 構 造 体 で 用 い る と 仮 定 し て い る 。 し た が っ て 、 対 応 す る /proc フ ァ イ ル は ネ ッ ト ワ ー ク 回 線 上 で の 大 き さ の 2 倍 に な る 。
Linux で は 、 SO_REUSEADDR オ プ シ ョ ン で ポ ー ト の 再 利 用 が 許 可 さ れ る の は 、 そ の ポ ー ト に 対 し て bind(2) を 前 に 実 行 し た プ ロ グ ラ ム と そ の ポ ー ト を 再 利 用 し よ う と す る プ ロ グ ラ ム の 両 方 で SO_REUSEADDR が セ ッ ト さ れ た 場 合 の み で あ る 。 こ の 動 作 は (FreeBSD な ど の ) い く つ か の 実 装 と は 異 な る 。 こ れ ら で は 、 後 で ポ ー ト を 再 利 用 し よ う と す る プ ロ グ ラ ム で SO_REUSEADDR オ プ シ ョ ン を セ ッ ト す る だ け で よ い 。 た い て い は こ の 違 い は 見 え な い 。 な ぜ な ら 、 例 え ば サ ー バ プ ロ グ ラ ム は 常 に こ の オ プ シ ョ ン を セ ッ ト す る よ う に 設 計 さ れ る か ら で あ る 。
バ グ
CONFIG_FILTER ソ ケ ッ ト オ プ シ ョ ン で あ る SO_ATTACH_FILTER と SO_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/ に 書 か れ て い る 。