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