Manpages

NAME

send, sendto, sendmsg - 从 套 接 字 发 送 消 息

概 述

#include <sys/types.h>
#include <sys/socket.h>

int send(int s, const void *msg, size_t len, int flags);
int sendto(int
s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
int sendmsg(int
s, const struct msghdr *msg, int flags);

描 述

Send, sendto, 和 sendmsg 用 于 向 另 一 个 套 接 字 传 递 消 息 . Send 仅 仅 用 于 连 接 套 接 字 ,而 sendtosendmsg 可 用 于 任 何 情 况 下 . 目 标 地 址 用 to 指 定 , tolen 定 义 其 长 度 .消 息 的 长 度 用 len 指 定 . 如 果 消 息 太 长 不 能 通 过 下 层 协 议 ,函 数 将 返 回 EMSGSIZE 错 误 ,消 息 也 不 会 被 送 出 . 在 数 据 传 送 过 程 中 所 产 生 的 错 误 不 会 返 回 给 send. 如 果 发 生 本 地 错 误 ,则 返 回 -1. 当 要 发 送 的 消 息 长 度 大 于 套 接 字 当 前 可 用 缓 冲 区 时 , send 将 阻 塞 ,除 非 在 套 接 字 上 设 置 了 非 阻 塞 式 输 入 输 出 模 式 . 对 于 非 阻 塞 模 式 ,这 种 情 况 下 将 返 回 EAGAIN 错 误 . The 系 统 调 用 select(2) 可 以 用 来 检 测 何 时 可 以 发 送 更 多 的 数 据 . 参 数 flags 是 一 个 标 志 字 ,可 以 包 含 下 列 标 志 : 对 于 支 持 带 外 数 据 的 套 接 字 ,

MSG_OOB 将 送 出 out-of-band (带 外 )数 据 (比 如 , SOCK_STREAM 类 型 的 套 接 字 ); 下 层 协 议 也 必 须 支 持 . 带 外 数 据 .

MSG_DONTROUTE 在 送 出 分 组 时 不 使 用 网 关 .只 有 直 接 连 接 在 网 络 上 的 主 机 才 能 接 收 到 数 据 .这 个 标 志 通 常 仅 用 于 诊 断 和 路 由 程 序 . 可 路 由 的 协 议 族 才 能 使 用 这 个 标 志 ;包 套 接 字 不 可 以 .
MSG_DONTWAIT
使 用 非 阻 塞 式 操 作 ;如 果 操 作 需 要 阻 塞 ,将 返 回 EAGAIN 错 误 (也 可 以 用 F_SETFL fcntl(2) 设 置 O_NONBLOCK 实 现 这 个 功 能 .)
MSG_NOSIGNAL
当 流 式 套 接 字 的 另 一 端 中 断 连 接 时 不 发 送 SIGPIPE 信 号 ,但 仍 然 返 回 EPIPE 错 误 .
MSG_CONFIRM
(仅 用 于 Linux 2.3以 上 版 本 ) 通 知 链 路 层 发 生 了 转 发 过 程 :得 到 了 另 一 端 的 成 功 应 答 . 如 果 链 路 层 没 有 收 到 通 知 ,它 将 按 照 常 规 探 测 网 络 上 的 相 邻 主 机 (比 如 通 过 免 费 arp). 只 能 用 于 SOCK_DGRAMSOCK_RAW 类 型 的 套 接 字 ,且 仅 对 IPv4和 IPv6有 效 .详 情 参 见 arp(7) 结 构 体 msghdr 的 定 义 如 下 .详 情 参 见 recv(2) 和 下 文 .

struct msghdr {

void

* msg_name;

/*地 址 选 项 */

socklen_t

msg_namelen;

/*地 址 长 度 */

struct iovec

* msg_iov;

/*消 息 数 组 */

size_t

msg_iovlen;

/*msg_iov中 的 元 素 个 数 */

void

* msg_control;

/*辅 助 信 息 ,见 下 文 */

socklen_t

msg_controllen;

/*辅 助 数 据 缓 冲 区 长 度 */

int

msg_flags;

/*接 收 消 息 标 志 */ }; 可 以 使 用

msg_controlmsg_controllen 成 员 发 送 任 何 控 制 信 息 .内 核 所 能 处 理 的 最 大 控 制 消 息 缓 冲 区 长 度 由 net.core.optmem_max sysctl对 每 个 套 接 字 进 行 限 定 ;参 见 socket(7).

返 回 值

成 功 时 返 回 发 送 的 字 符 个 数 ,否 则 返 回 -1.

错 误 代 码

其 中 一 些 是 套 接 字 层 产 生 的 标 准 错 误 .其 他 的 是 下 层 协 议 模 块 产 生 的 ;参 见 各 自 的 man手 册 .

EBADF 指 定 了 非 法 描 述 符

.

ENOTSOCK 参 数 s 不 是 一 个 套 接 字 .

EFAULT 参 数 指 定 的 用 户 地 址 空 间 非 法

.

EMSGSIZE 消 息 长 度 越 界 .
EAGAIN
或 者 EWOULDBLOCK 套 接 字 设 置 为 非 阻 塞 式 ,但 所 请 求 的 操 作 需 要 阻 塞 .
ENOBUFS
网 络 接 口 输 出 队 列 已 满 .这 通 常 表 明 接 口 已 停 止 发 送 ,也 有 可 能 是 暂 时 性 的 拥 挤 (这 不 会 发 生 在 linux下 ,当 设 备 队 列 溢 出 时 数 据 报 只 是 被 简 单 丢 弃 .

EINTR 接 收 到 信 号

.

ENOMEM 没 有 可 用 内

存 .

EINVAL 传 递 的 参 数 非

法 .

EPIPE 连 接 套 接 字 的 本

地 端 已 关 闭 .这 种 情 况 下 进 程 还 会 接 收 到 SIGPIPE 信 号 ,除 非 设 置 了 MSG_NOSIGNAL

兼 容 于

4.4BSD,SVr4,POSIX1003.1g草 案 (这 些 系 统 调 用 首 次 出 现 于 4.2BSD). MSG_CONFIRM 是 Linux所 做 的 扩 展 .

注 意

上 面 给 出 的 函 数 原 型 遵 循 Single Unix Specification, glibc2也 是 这 么 做 的 ; flags 参 数 在 BSD4.*中 是 ’int’,但 在 libc4和 libc5中 是 ’unsigned int’; 参 数 len 在 BSD4.*和 libc4中 是 ’int’,但 在 libc5中 是 ’size_t’; 参 数 tolen 在 BSD4.*,libc4和 libc5中 都 是 ’int’. 参 见 accept(2).

SEE ALSO

fcntl(2), recv(2), select(2), getsockopt(2), sendfile(2), socket(2), write(2), socket(7), ip(7), tcp(7), udp(7)

[中 文 版 维 护 人 ]

byeyear <love_my_love [AT] 263.net >

[中 文 版 最 新 更 新 ]

2002.02.27

《 中 国 linux论 坛 man手 册 页 翻 译 计 划 》 :

http://cmpp.linuxforum.net

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh

COMMENTS