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 |