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)
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_t 的 si_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_FILTER 和 SO_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手 册 页 翻 译 计 划 》 :
跋
本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh