Manpages

名 字

socket - 建 立 一 個 用 於 交 流 的 端 點

概 要

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

描 述

socket() 建 立 一 個 用 於 交 流 的 端 點 並 且 返 回 一 個 描 述 符 。

The domain 參 數 指 定 一 個 通 訊 域 名 ; 選 擇 的 協 議 將 會 用 於 通 訊 。 協 議 名 在 <sys/socket.h> 中 定 義 。 目 前 已 知 的 格 式 包 括 :

套 接 字 通 過 type, 參 數 來 確 定 通 信 語 義 。 目 前 定 義 的 類 型 有 :

SOCK_STREAM 提 供 有 序 的 , 可 靠 的 , 雙 向 的 , 基 於 字 節 流 的 通 訊 。 可 能 支 持 帶 外 傳 輸 。

SOCK_DGRAM 提 供 數 據 報 ( 不 面 向 連 接 的 , 不 可 靠 的 固 定 最 大 長 度 的 信 息 ) 。

SOCK_SEQPACKET 提 供 有 序 的 , 可 靠 的 , 雙 向 的 , 基 於 固 定 最 大 長 度 的 數 據 報 傳 輸 路 徑 ; 需 要 一 個 讀 取 整 個 伴 有 輸 入 系 統 調 用 的 包 的 用 戶 。

SOCK_RAW 提 供 未 加 工

(raw)的 網 絡 協 議 通 道 。

SOCK_RDM 提 供 可 靠 的 數 據 報 層 , 但 是 不 保 證 順 序 。

SOCK_PACKET 廢 棄 的 , 不 應 該 在 新 的 程 序 中 使 用 , 參 考

packet(7)

一 些 套 接 字 類 型 並 未 被 所 有 的 協 議 實 現 ; 例 如 , SOCK_SEQPACKET 並 不 被 AF_INET AF_INET 實 現 。 從 Linux 2.6.27 開 始 , type 參 數 可 以 提 供 其 他 的 功 能 : 注 意 一 些 套 接 字 類 型 可 能 包 括 一 下 值 的 或 位 , 用 來 修 改 socket(): 的 行 爲 。

SOCK_NONBLOCK 設 置

O_NONBLOCK 的 標 誌 於 新 打 開 的 文 件 描 述 符 。 通 過 這 個 標

誌 可 以 不 用 調 用 fcntl(2) 來 達 到 相 同 的 結 果 。

SOCK_CLOEXEC 設 置

close-on-exec (FD_CLOEXEC) 的 標 誌 於 新 打 開 的 文 件 描

述 符 。 參 見 open(2) 中 關 於 O_CLOEXEC 的 描 述 , 因 爲 一 些 原 因 這 個 標 誌 很 有 用 。

protocol 指 定 一 個 協 議 用 於 套 接 字 。 指 定 一 個 協 議 用 於 套 接 字 。 一 般 情 況 下 , 在 給 定 的 協 議 中 只 允 許 在 一 個 套 接 字 上 使 用 一 個 協 議 , 注 意 protocol 可 以 指 定 爲 數 字 0 。 但 是 , 可 能 存 在 着 很 多 協 議 , 但 是 在 本 手 冊 的 協 議 必 須 使 用 一 個 。 協 議 用 於 指 定 通 訊 發 生 地 方 的 “通 訊 域 名 ”, 參 考 protocols(5) 。 參 考 getprotoent(3) 中 關 於 如 何 把 協 議 名 稱 字 符 串 與 協 議 編 號 進 行 映 射 。

SOCK_STREAM 類 型 的 套 接 字 是 雙 向 直 接 數 據 流 的 , 和 管 道 十 分 相 似 。 他 們 不 對 記 錄 溢 出 提 供 保 護 。 一 個 套 接 字 流 在 接 受 或 發 出 任 何 數 據 時 必 須 處 於 connected 的 狀 態 。 和 其 它 套 接 字 通 過 connect(2) 調 用 來 建 立 連 接 。 一 旦 連 接 , 數 據 可 能 通 過 read(2)write(2) 系 統 調 用 來 傳 輸 , 也 或 者 是 不 同 的 send(2)recv(2) 系 統 調 用 。 當 會 話 結 束 時 , 可 能 會 執 行 close(2) 帶 外 數 據 可 能 也 用 send(2)recv(2) 描 述 與 接 受 。

SOCK_STREAM 類 型 的 的 通 信 協 議 應 確 保 信 息 不 丟 失 與 重 複 。 如 果 一 塊 有 協 議 緩 衝 的 數 據 不 能 在 合 理 時 間 內 傳 輸 , 連 接 會 被 認 爲 超 時 。 當 在 套 接 字 上 啓 用 SO_KEEPALIVE , 協 議 會 以 其 特 定 方 式 檢 查 另 一 端 是 否 活 着 。 當 一 個 進 程 接 受 或 發 送 了 一 個 錯 誤 的 數 據 流 , 會 產 生 並 接 受 一 個 SIGPIPE 信 號 ; 對 於 採 取 默 認 處 理 此 信 號 的 進 程 , 它 將 會 退 出 。 SOCK_SEQPACKET 套 接 字 採 用 和 SOCK_STREAM 套 接 字 相 同 的 系 統 調 用 。 唯 一 不 同 的 是 , read(2) 系 統 調 用 只 會 返 回 請 求 的 數 據 量 , 並 將 餘 下 到 達 的 任 何 數 據 數 據 包 丟 棄 。 此 外 所 有 的 消 息 邊 界 的 傳 入 的 數 據 報 將 被 保 留 。

SOCK_DGRAMSOCK_RAW 類 型 的 套 接 字 支 持 用 sendto(2) 系 統 調 用 來 發 送 數 據 報 , 數 據 報 通 常 是 用 recvfrom(2), 來 接 受 的 , 這 個 調 用 會 在 下 一 個 數 據 報 中 單 獨 的 返 回 發 送 者 的 地 址 。

SOCK_PACKET 是 一 個 遺 留 的 套 接 字 類 型 , 用 來 從 設 備 驅 動 中 接 受 原 始 數 據 , 已 經 被 packet(7) 調 用 取 代 。

fcntl(2)F_SETOWN 操 作 可 以 在 帶 外 數 據 到 達 時 讓 進 程 或 進 程 組 會 收 到 一 個 SIGURG 信 號 , 或 者 在 SOCK_STREAM 類 型 的 連 接 在 被 不 期 望 地 打 斷 時 , 收 到 SIGPIPE 信 號 。 這 個 操 作 也 可 能 被 用 於 讓 進 程 或 進 程 組 通 過 SIGIO. 接 收 I/O 和 I/O 不 同 步 的 通 知 。 使 用 F_SETOWN 等 同 於 使 用 了 FIOSETOWNSIOCSPGRP 參 數 的 ioctl(2) 系 統 調 用 。 當 網 絡 向 協 議 模 型 發 出 一 個 錯 誤 情 況 的 信 號 ( 例 如 , 對 IP使 用 ICMP消 息 ) , 套 接 字 將 會 設 置 上 pending錯 誤 標 誌 。 對 套 接 字 接 下 去 的 操 作 將 會 返 回 pending錯 誤 的 錯 誤 代 碼 。 對 於 一 些 協 議 , 可 能 會 爲 每 一 個 接 字 接 啓 用 一 個 用 於 取 出 詳 細 錯 誤 信 息 的 錯 誤 列 隊 ; 參 見 ip(7) 中 的 IP_RECVERR 。 套 接 字 的 操 作 由 套 接 字 級 的 選 項 來 控 制 。 這 些 選 項 定 義 於 <sys/socket.h> 中 。 setsockopt(2)setsockopt(2) 用 於 分 別 用 於 設 置 和 讀 取 選 項 。

返 回 值

成 功 時 , 會 返 回 新 套 接 字 的 文 件 描 述 符 。 錯 誤 時 , 返 回 -1 , 同 時 errno 會 被 適 當 設 置 。

錯 誤

EACCES 不 允 許 創 建 指 定 的 類 型 和

/或 指 定 的 協 議 的 套 接 字 。

EAFNOSUPPORT 工 具 不 支 持 指 定 的 地 址 。

EINVAL 未 知 協 議 , 或 協 議 組 不 可 用 。

EINVAL 錯 誤 的

type 標 誌 。

EMFILE 進 程 文 件 表 溢 出 。

ENFILE 已 經 達 到 系 統 上 限 的 文 件 打 開 數 。

ENOBUFSENOMEM 沒 有 足 夠 的 內 存 , 直 到 有 可 用 的 資 源 套 接 字 不 能 被 創 建 。
EPROTONOSUPPORT
協 議 類 型 或 指 定 的 協 議 不 被 當 前 域 所 支 持 。 其 它 的 錯 誤 可 能 是 由 協 議 模 型 產 生 的 。

兼 容 性

4.4BSD, POSIX.1-2001.

SOCK_NONBLOCKSOCK_CLOEXEC 標 誌 是 Linux 特 有 的 。 socket() appeared in 4.2BSD. 出 現 於 4.2BSD 。 通 常 , 非 BSD 系 統 的 BSD 套 接 字 層 克 隆 是 可 移 植 的 ( 包 括 System V 的 變 種 ) 。

注 意

並 不 要 求 包 含 <sys/types.h> , 這 個 頭 文 件 在 Linux下 是 不 必 須 的 。 可 是 一 些 歷 史 上 的 (BSD) 工 具 要 求 這 個 頭 文 件 , 可 移 植 程 序 很 可 能 希 望 包 含 它 。 4.x BSD下 明 顯 固 定 的 協 議 組 有 PF_UNIX, PF_INET, 等 等 , 但 是 AF_UNIX等 , 它 們 是 用 於 地 址 組 的 。 可 是 BSD的 man page保 證 “協 議 組 一 般 等 於 地 址 組 ”, 隨 後 的 標 準 在 每 個 地 方 都 使 用 了 AF_* 。

<sys/types.h> 文 件 頭 只 在 libc4以 前 是 必 須 的 。 一 些 包 , 如 util-linux, claim, 是 用 於 在 所 以 Linux版 本 和 庫 上 可 移 植 的 。 它 們 確 實 需 要 這 個 頭 文 件 。

例 子

getaddrinfo(3)。 中 有 一 個 使 用 socket() 的 例 子 。

參 見

accept(2), bind(2), connect(2), fcntl(2), getpeername(2), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2), getprotoent(3), ip(7), socket(7), tcp(7), udp(7), unix(7) “An Introductory 4.3BSD Interprocess Communication Tutorial” 在 中 被 重 印 。 “BSD Interprocess Communication Tutorial” 在 UNIX Programmer’s Supplementary Documents Volume 1 中 被 重 印 。

COLOPHON

This page is part of release 3.27 of the Linux man-pages project. A description of the project, and information about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/. 譯 者 於 2011-07-26翻 譯 , 於 2013-02-08修 訂 譯 文 與 原 文 的 版 權 協 議 一 致

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