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