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