Man page - socket(7)

Packages contains this manual

Available languages:

en fr ja ru zh_TW zh_CN

Manual

SOCKET

NAME
總 覽
描 述
套 接 層 函 式
套 接 字 選 項
SIGNALS
SYSCTLS
IOCTLS
注 意
缺 陷
VERSIONS 版 本
作 者
又 見
[中 文 版 維 護 人 ]
[中 文 版 最 新 更 新 ]
《 中 國 linux論 壇 man手 冊 頁 翻 譯 計 劃 》 :


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) 等 待 各 種 事 件 .

Image grohtml-687785-1.png

另 外 一 個 的 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@sina.com>

[中 文 版 最 新 更 新 ]

2000/11/06

《 中 國 linux論 壇 man手 冊 頁 翻 譯 計 劃 》 :

http://cmpp.linuxforum.net

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。
中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh