Manpages

NAME

socket - Linux 套 接 字

总 览

#include <sys/socket.h>
mysocket
= socket(int socket_family, int socket_type, int protocol);

描 述

本 手 册 页 介 绍 了 Linux 套 接 字 的 用 户 接 口 . 这 个 BSD 兼 容 套 接 字 是 介 于 用 户 进 程 与 内 核 网 络 协 议 栈 之 间 的 统 一 接 口 , 各 协 议 模 块 属 于 不 同 的 协 议 族 ,如 PF_INET, PF_IPX, PF_PACKET套 接 字 类 型 ,如 字 节 流 ( SOCK_STREAM)数 据 报 ( SOCK_DGRAM) . 关 于 协 议 族 和 套 接 字 类 型 请 参 考 socket(2).

套 接 层 函 数

用 户 通 过 这 些 套 接 字 函 数 发 送 和 接 收 包 , 以 及 其 他 套 接 字 操 作 . 详 细 说 明 参 看 他 们 各 自 的 手 册 页 .

socket(2) 创 建 套 接 字 ,

connect(2) 与 远 程 套 接 字 地 址 建 立 连 接

bind(2) 把 套 接 字 和 一 个 本 地 套 接 字 地 址 绑 定 在 一 起 ( 为 套 接 字 分 配 一 个 本 地 协 议 地 址 )

listen(2) 通 知 套 接 字 接 受 新 的 连 接

accept(2) 为 新 的 已 完 成 连 接 获 得 新 的 描 述 字

socketpair(2) 返 回 两 个 连 接 的 匿 名 套 接 字 ( 仅 在 某 些 本 地 族 中 才 有 实 现 ,如 PF_UNIX

send(2),

sendto(2), 和 sendmsg(2) 通 过 套 接 字 发 送 数 据 , 而 recv(2), recvfrom(2), recvmsg(2) 从 套 接 字 接 收 数 据 . poll(2)

select(2) 等 待 数 据 到 来 或 准 备 好 接 收 数 据 . 除 此 之 外 , 标 准 I/O 操 作 如 write(2), writev(2), sendfile(2), read(2), 和 readv(2) 也 可 用 来 读 入 ( 接 收 ) 和 写 出 ( 发 送 ) 数 据 .

getsockname(2) 用 于 获 得 本 地 套 接 字 地 址

getpeername(2) 用 于 获 得 远 端 套 接 字 地 址 . getsockopt(2)setsockopt(2) 用 于 设 置 或 取 得 套 接 字 或 协 议 选 项 . ioctl(2) 也 可 以 用 来 设 置 或 读 取 一 些 其 他 选 项 .

close(2) 关 闭 套 接 字 . shutdown(2) 关 闭 全 双 工 套 接 字 连 接 的 一 部 分 . 套 接 字 不 支 持 搜 索 , 也 不 支 持 调 用 pread(2)pwrite(2) 进 行 非 0 位 置 的 操 作 . 可 以 用 fcntl(2). 设 置 O_NONBLOCK 标 志 来 实 现 对 套 接 字 的 非 阻 塞 I/O 操 作 O_NONBLOCK 是 从 accept 继 承 来 的 , 然 后 原 来 所 有 会 阻 塞 的 操 作 会 返 回 EAGAIN. connect(2) 在 此 情 况 下 返 回 EINPROGRESS 错 误 . 用 户 可 以 通 过 poll(2) 或 者 select(2) 等 待 各 种 事 件 .

另 外 一 个 的 poll/select 方 法 是 让 内 核 用 SIGIO 信 号 来 通 知 应 用 程 序 . 要 这 么 用 的 话 你 必 须 用 fcntl(2) 设 置 套 接 字 文 件 描 述 符 的 FASYNC 标 志 , 并 用 sigaction(2). 给 SIGIO 信 号 设 置 一 个 的 有 效 信 号 处 理 句 柄 .参 看 下 面 的 SIGNALS 的 讨 论 .

套 接 字 选 项

套 接 字 选 项 可 以 用 setsockopt(2) 来 设 置 , 用 getsockopt(2) 读 取 所 有 套 接 字 级 别 设 为 SOL_SOCKET 的 套 接 字 的 套 接 字 选 项 :

SO_KEEPALIVE 允 许 在 面 向 连 接 的 套 接 字 上 发 送 keep-alive 消 息 的 功 能 .是 一 个 布 尔 整 数 .
SO_OOBINLINE
如 果 打 开 这 个 选 项 , 带 外 ( Out-of-Band) 数 据 可 以 直 接 放 入 接 收 数 据 流 。 否 则 , 只 有 接 收 时 打 开 MSG_OOB 标 志 , 才 接 收 带 外 数 据 .
SO_RCVLOWAT
SO_SNDLOWAT 声 明 在 开 始 向 协 议 (SO_SNDLOWAT) 或 正 在 接 收 数 据 的 用 户 (SO_RCVLOWAT). 传 递 数 据 之 前 缓 冲 区 内 的 最 小 字 节 数 . 在 Linux 中 这 两 个 值 是 不 可 改 变 的 , 固 定 为 1 字 节 . 可 以 用 getsockopt 用 来 读 取 它 们 的 值 ; setsockopt 总 是 返 回 ENOPROTOOPT.
SO_RCVTIMEO
SO_SNDTIMEO 发 送 和 接 收 时 的 超 时 设 定 , 并 在 超 时 时 报 错 . 在 Linux 中 由 协 议 指 定 , 不 能 被 读 写 . 它 们 的 功 能 可 用 alarm(2) 或 者 setitimer(2). 来 模 拟 .
SO_BSDCOMPAT
允 许 BSD 的 bug-to-bug 兼 容 . 这 一 项 只 能 在 UDP 协 议 模 块 中 使 用 而 且 今 后 将 要 取 消 . 如 果 允 许 的 话 , UDP 套 接 字 接 收 到 的 ICMP 错 误 将 不 会 被 传 送 至 用 户 程 序 . Linux 2.0 中 对 于 原 始 套 接 字 也 允 许 BSD bug-to-bug 兼 容 ( 报 头 随 机 改 变 ,省 略 广 播 标 识 ) ,但 在 Linux 2.2 中 取 消 了 这 一 项 . 修 改 用 户 程 序 的 方 式 比 较 好 .
SO_PASSCRED
允 许 或 关 闭 SCM_CREDENTIALS 控 制 消 息 的 接 收 . 更 多 信 息 参 见 unix(7).
SO_PEERCRED
返 回 连 接 至 此 套 接 字 的 外 部 进 程 的 身 份 验 证 . 只 在 PF_UNIX 套 接 字 中 有 用 .参 见 unix(7). 参 数 为 ucred 结 构 .只 在 getsockopt. 中 有 效 .
SO_BINDTODEVICE
将 此 套 接 字 绑 定 到 一 个 特 定 的 设 备 上 , 如 “eth0”, 做 为 指 定 的 接 口 名 字 传 递 . 如 果 名 称 是 空 字 符 串 或 此 项 长 度 为 0, 则 套 接 字 设 备 绑 定 被 取 消 . 过 去 的 选 项 是 一 个 变 长 的 空 零 结 尾 的 接 口 名 称 的 字 符 串 , 其 最 大 长 度 为 IFNAMSIZ. 如 果 一 个 套 接 字 被 绑 定 至 一 接 口 , 只 有 由 这 个 特 定 接 口 接 收 的 信 息 包 可 以 由 此 套 接 字 处 理 .
SO_DEBUG
允 许 套 接 字 调 试 .只 对 有 CAP_NET_ADMIN 功 能 或 有 效 用 户 标 识 为 0 的 进 程 有 效 .
SO_REUSEADDR
表 示 在 一 个 bind(2) 调 用 中 对 提 供 给 它 的 地 址 使 用 的 确 认 规 则 应 该 允 许 重 复 使 用 本 地 地 址 . 对 于 PF_INET 套 接 字 , 这 表 示 该 套 接 字 可 以 绑 定 , 除 非 已 有 一 个 活 跃 的 侦 听 套 接 口 绑 定 到 此 地 址 上 . 如 果 这 个 侦 听 套 接 字 和 一 个 指 定 端 口 绑 定 为 INADDR_ANY 时 , 它 就 不 能 再 绑 定 到 任 何 本 地 地 址 的 此 端 口 .
SO_TYPE
按 整 数 返 回 套 接 字 类 型 ( 如 SOCK_STREAM) 只 能 通 过 getsockopt 读 取 .
SO_DONTROUTE
不 通 过 网 关 发 送 , 只 能 发 送 给 直 接 连 接 的 主 机 .可 以 通 过 在 套 接 字 的 send(2) 操 作 上 设 置 MSG_DONTROUTE 标 志 来 实 现 相 同 的 效 果 . 其 值 为 布 尔 型 整 数 的 标 识 .
SO_BROADCAST
设 置 或 获 取 广 播 标 识 . 当 选 择 此 选 项 时 , 数 据 报 套 接 字 接 收 向 广 播 地 址 发 送 的 数 据 包 , 并 且 可 以 向 广 播 地 址 发 送 数 据 包 . 这 一 选 项 对 于 面 向 流 的 套 接 字 无 效 .
SO_SNDBUF
设 置 或 得 到 套 接 字 发 送 缓 冲 区 的 最 大 字 节 数 . 其 默 认 值 由 wmem_default sysctl 设 置 ,最 大 允 许 值 由 wmem_max sysctl 设 置 .
SO_RCVBUF
设 置 或 得 到 套 接 字 接 收 缓 冲 区 的 最 大 字 节 数 。 其 默 认 值 由 rmem_default sysctl设 置 ,最 大 允 许 值 由 rmem_max sysctl 设 置 .
SO_LINGER
设 置 或 获 取 SO_LINGER 选 项 的 值 . 其 参 数 为 linger 结 构 .

struct linger {

int

l_onoff;

/* 延 时 状 态 ( 打 开 /关 闭 ) */

int

l_linger;

/* 延 时 多 长 时 间 */ }; 如 果 选 择 此 选 项 ,

close(2)shutdown(2) 将 等 到 所 有 套 接 字 里 排 队 的 消 息 成 功 发 送 或 到 达 延 迟 时 间 后 才 会 返 回 . 否 则 , 调 用 将 立 即 返 回 . 而 closing 操 作 将 在 后 台 进 行 . 如 果 套 接 字 是 exit(2), 的 一 部 分 关 闭 时 , 它 总 是 在 后 台 延 迟 进 行 的 .

SO_PRIORITY 设 置 在 此 套 接 字 发 送 的 所 有 包 的 协 议 定 义 优 先 权 . Linux 通 过 这 一 值 来 排 列 网 络 队 列 : 根 据 所 选 设 备 排 队 规 则 , 具 有 更 高 优 先 权 的 包 可 以 先 被 处 理 .对 于 ip(7), 同 时 也 设 置 了 输 出 包 的 IP 服 务 类 型 ( TOS) 的 域 .
SO_ERROR
取 得 并 清 除 未 解 决 的 套 接 字 错 误 . 只 有 在 getsockopt. 时 有 效 . 是 一 个 整 数 值 .

SIGNALS

当 向 一 个 已 关 闭 ( 被 本 地 或 远 程 终 端 ) 的 面 向 联 接 的 套 接 字 写 入 时 , 将 向 该 写 入 进 程 发 送 SIGPIPE 信 号 , 并 返 回 EPIPE 如 果 写 入 命 令 声 明 了 MSG_NOSIGNAL 标 识 时 , 不 会 发 出 此 信 号 . 如 果 与 FIOCSETOWN fcntl 或 SIOCSPGRP ioctl 一 起 请 求 , 那 么 当 发 生 I/O 事 件 时 发 出 SIGIO 这 样 我 们 就 可 以 在 信 号 句 柄 里 使 用 poll(2)select(2) 找 出 发 生 事 件 的 套 接 字 . 另 一 种 选 择 ( 在 Linux 2.2 中 ) 是 用 F_SETSIG fcntl 设 置 一 个 实 时 信 号 : 实 时 信 号 的 处 理 程 序 被 调 用 时 还 会 收 到 它 的 siginfo_tsi_fd 区 域 中 的 文 件 描 述 符 . 更 多 信 息 参 见 fcntl(2) 在 某 些 环 境 中 ( 例 如 :多 个 进 程 访 问 单 个 套 接 字 ) , 引 发 SIGIO 的 东 西 在 进 程 对 信 号 作 出 反 应 时 可 能 已 经 消 失 了 . 如 果 这 样 的 话 , 进 程 应 该 再 次 等 待 , 因 为 Linux 稍 后 会 重 发 此 信 号 .

SYSCTLS

可 以 通 过 目 录 /proc/sys/net/core/* 下 的 文 件 或 者 用 sysctl(2) 系 统 调 用 来 访 问 内 核 套 接 字 的 网 络 系 统 控 制 ( sysctl) 信 息 .

rmem_default 指 明 套 接 字 接 收 缓 冲 区 的 默 认 字 节 数 .
rmem_max
指 明 套 接 字 接 收 缓 冲 区 的 最 大 字 节 数 , 用 户 可 以 通 过 使 用 SO_RCVBUF 套 接 字 选 项 来 设 置 此 值 .
wmem_default
指 明 套 接 字 发 送 缓 冲 区 的 默 认 字 节 数 .
wmem_max
指 明 发 送 缓 冲 区 的 最 大 字 节 数 , 用 户 可 以 通 过 使 用 套 接 字 的 SO_SNDBUF 选 项 来 设 置 它 的 值 .
message_cost
message_burst 设 定 记 号 存 储 桶 过 滤 器 , 在 存 储 桶 中 保 存 一 定 数 量 的 外 部 网 络 事 件 导 致 的 警 告 消 息 .
netdev_max_backlog
在 全 局 输 入 队 列 中 包 的 最 大 数 目 .
optmem_max
每 个 套 接 字 的 象 iovecs 这 样 的 辅 助 数 据 和 用 户 控 制 数 据 的 最 大 长 度 .

IOCTLS

以 上 的 IO 控 制 值 可 以 通 过 ioctl(2) 来 访 问 :

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

SIOCGSTAMP 返 回 timeval 类 型 的 结 构 , 其 中 包 括 有 发 送 给 用 户 的 最 后 一 个 包 接 收 时 的 时 间 戳 。 被 用 来 测 量 精 确 的 RTT ( round trip time) 时 间 . struct timeval. 结 构 说 明 请 参 考 setitimer(2)
SIOCSPGRP
在 异 步 IO 操 作 结 束 或 者 接 收 到 紧 急 数 据 时 , 用 来 设 置 进 程 或 进 程 组 , 向 它 ( 它 们 ) 发 送 SIGIO 或 者 SIGURG 信 号 , 参 数 为 指 向 pid_t. 类 型 的 指 针 。 如 果 参 数 为 正 , 则 发 送 信 号 到 相 应 的 进 程 。 如 果 参 数 为 负 , 则 发 送 信 号 到 此 参 数 绝 对 值 id 所 属 的 进 程 组 的 所 有 进 程 。 如 果 它 没 有 CAP_KILL 功 能 或 者 它 的 有 效 UID 不 是 0, 进 程 只 能 选 择 它 自 己 或 自 己 的 进 程 组 来 接 收 信 号 .
FIOASYNC
改 变 O_ASYNC 标 志 来 打 开 或 者 关 闭 套 接 字 的 异 步 IO 模 式 。 异 步 IO模 式 指 的 是 : 当 新 的 I/O 事 件 发 生 时 , 将 发 出 SIGIO 信 号 或 者 用 F_SETSIG 设 置 的 信 号 . 参 数 为 整 形 布 尔 量 .
SIOCGPGRP
获 得 当 前 接 收 SIGIO 或 者 SIGURG 信 号 的 进 程 或 者 进 程 组 , 如 果 两 个 信 号 都 没 有 设 置 , 则 为 0. 有 效 的 fcntl:
FIOCGETOWN
与 IO 控 制 中 的 SIOCGPGRP 相 同 .
FIOCSETOWN
与 IO 控 制 中 的 SIOCSPGRP 相 同 .

注 意

Linux 假 设 有 一 半 的 发 送 /接 收 缓 冲 区 是 用 来 处 理 内 核 结 构 , 因 此 , 系 统 控 制 的 缓 冲 区 是 网 络 可 访 问 的 缓 冲 区 的 两 倍 .

缺 陷

CONFIG_FILTER 没 有 介 绍 SO_ATTACH_FILTERSO_DETACH_FILTER 套 接 字 选 项 . 在 libpcap 库 有 此 接 口 的 说 明

VERSIONS 版 本

SO_BINDTODEVICE 在 Linux 2.0.30 中 引 入 . SO_PASSCRED 是 在 Linux 2.2 中 引 入 的 新 选 项 . sysctl 是 在 Linux 2.2. 中 引 入 的 新 概 念 。

作 者

本 手 册 页 由 Andi Kleen 编 写 .

又 见

socket(2), ip(7), setsockopt(2), getsockopt(2), packet(7), ddp(7)

[中 文 版 维 护 人 ]

liguoping <liguoping_11 [AT] sina.com>

[中 文 版 最 新 更 新 ]

2000/11/06

《 中 国 linux论 坛 man手 册 页 翻 译 计 划 》 :

http://cmpp.linuxforum.net

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh