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 仅 仅 用 于 连 接 套 接 字 ,而 sendto 和 sendmsg 可 用 于 任 何 情 况 下 . 目 标 地 址 用 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_DGRAM
和 SOCK_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_control 和 msg_controllen 成 员 发 送 任 何 控 制 信 息 .内 核 所 能 处 理 的 最 大 控 制 消 息 缓 冲 区 长 度 由 net.core.optmem_max sysctl对 每 个 套 接 字 进 行 限 定 ;参 见 socket(7).
返 回 值
成 功 时 返 回 发 送 的 字 符 个 数 ,否 则 返 回 -1.
错 误 代 码
其 中 一 些 是 套 接 字 层 产 生 的 标 准 错 误 .其 他 的 是 下 层 协 议 模 块 产 生 的 ;参 见 各 自 的 man手 册 .
EBADF 指 定 了 非 法 描 述 符 |
. |
ENOTSOCK 参 数 s 不 是 一 个 套 接 字 .
EFAULT 参 数 指 定 的 用 户 地 址 空 间 非 法 |
. |
EMSGSIZE 消
息 长 度 越 界 .
EAGAIN或 者 EWOULDBLOCK 套
接 字 设 置 为 非
阻 塞 式 ,但 所 请
求 的 操 作 需 要
阻 塞 .
ENOBUFS 网 络 接 口 输
出 队 列 已 满 .这
通 常 表 明 接 口
已 停 止 发 送 ,也
有 可 能 是 暂 时
性 的 拥 挤 (这 不
会 发 生 在 linux下 ,当
设 备 队 列 溢 出
时 数 据 报 只 是
被 简 单 丢 弃 .
EINTR 接 收 到 信 号 |
.
存 .
法 . 地 端 已 关 闭 .这 种 情 况 下 进 程 还 会 接 收 到 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 ALSOfcntl(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手 册 页 翻 译 计 划 》 :跋本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh |