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