.\" Copyright (c) 1983, 1991 The Regents of the University of California. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" Modified Sat Jul 24 01:15:33 1993 by Rik Faith .\" Modified Tue Oct 22 17:55:49 1996 by Eric S. Raymond .\" Modified Oct 1998 by Andi Kleen .\" 中文版 Copyright (c) 2002 byeyear 和 www.linuxforum.net .\" .TH SEND 2 "July 1999" "Linux Man Page" "Linux Programmer's Manual" .SH NAME send, sendto, sendmsg \- 从套接字发送消息 .SH 概述 .B #include .br .B #include .sp .BI "int send(int " s ", const void *" msg ", size_t " len "," .BI "int " flags ); .br .BI "int sendto(int " s ", const void *" msg ", size_t " len "," .BI "int " flags ", const struct sockaddr *" to ", socklen_t " tolen ); .br .BI "int sendmsg(int " s ", const struct msghdr *" msg "," .BI "int " flags ); .SH 描述 .BR Send , .BR sendto , 和 .B sendmsg 用于向另一个套接字传递消息. .B Send 仅仅用于连接套接字,而 .B sendto 和 .B sendmsg 可用于任何情况下. .PP 目标地址用 .I to 指定, .I tolen 定义其长度.消息的长度用 .IR len 指定. 如果消息太长不能通过下层协议,函数将返回 .B EMSGSIZE 错误,消息也不会被送出. .PP 在数据传送过程中所产生的错误不会返回给 .BR send. 如果发生本地错误,则返回\-1. .PP 当要发送的消息长度大于套接字当前可用缓冲区时, .B send 将阻塞,除非在套接字上设置了非阻塞式输入输出模式. 对于非阻塞模式,这种情况下将返回 .B EAGAIN 错误. The 系统调用 .BR select (2) 可以用来检测何时可以发送更多的数据. .PP 参数 .I flags 是一个标志字,可以包含下列标志: .\" XXX document MSG_PROXY .TP 对于支持带外数据的套接字, .B MSG_OOB 将送出 .I out-of-band (带外)数据(比如, .BR SOCK_STREAM 类型的套接字); 下层协议也必须支持. .I 带外 数据. .TP .B MSG_DONTROUTE 在送出分组时不使用网关.只有直接连接在网络上的主机 才能接收到数据.这个标志通常仅用于诊断和路由程序. 可路由的协议族才能使用这个标志;包套接字不可以. .TP .B MSG_DONTWAIT 使用非阻塞式操作;如果操作需要阻塞,将返回 .B EAGAIN 错误(也可以用 .B F_SETFL .BR fcntl(2) 设置 .B O_NONBLOCK 实现这个功能.) .TP .B MSG_NOSIGNAL 当流式套接字的另一端中断连接时不发送 .B SIGPIPE 信号,但仍然返回 .B EPIPE 错误. .TP .BR MSG_CONFIRM " (仅用于Linux 2.3以上版本)" 通知链路层发生了转发过程:得到了另一端的成功应答. 如果链路层没有收到通知,它将按照常规探测网络上的相邻 主机(比如通过免费arp). 只能用于 .B SOCK_DGRAM 和 .B SOCK_RAW 类型的套接字,且仅对IPv4和IPv6有效.详情参见 .BR arp (7) .PP 结构体 .I msghdr 的定义如下.详情参见 .BR recv (2) 和下文. .IP .RS .nf .ta 4n 17n 33n 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; /*接收消息标志*/ }; .ta .fi .RE .PP 可以使用 .I msg_control 和 .I msg_controllen 成员发送任何控制信息.内核所能处理的最大控制消息缓冲区长度由 .B net.core.optmem_max sysctl对每个套接字进行限定;参见 .BR socket (7). .SH 返回值 成功时返回发送的字符个数,否则返回-1. .SH 错误代码 其中一些是套接字层产生的标准错误.其他的是下层协议模块产生的;参见 各自的man手册. .TP .B EBADF 指定了非法描述符. .TP .B ENOTSOCK 参数 .I s 不是一个套接字. .TP .B EFAULT 参数指定的用户地址空间非法. .TP .B EMSGSIZE 消息长度越界. .TP .BR EAGAIN "或者" EWOULDBLOCK 套接字设置为非阻塞式,但所请求的操作需要阻塞. .TP .B ENOBUFS 网络接口输出队列已满.这通常表明接口已停止发送,也有可能是 暂时性的拥挤(这不会发生在linux下,当设备队列溢出时数据报 只是被简单丢弃. .TP .B EINTR 接收到信号. .TP .B ENOMEM 没有可用内存. .TP .B EINVAL 传递的参数非法. .TP .B EPIPE 连接套接字的本地端已关闭.这种情况下进程还会接收到 .B SIGPIPE 信号,除非设置了 .B MSG_NOSIGNAL .SH 兼容于 4.4BSD,SVr4,POSIX1003.1g草案(这些系统调用首次出现于4.2BSD). .B MSG_CONFIRM 是Linux所做的扩展. .SH 注意 上面给出的函数原型遵循Single Unix Specification, glibc2也是这么做的; .I flags 参数在BSD4.*中是`int',但在libc4和libc5中是`unsigned int'; 参数 .I len 在BSD4.*和libc4中是`int',但在libc5中是'size_t'; 参数 .I tolen 在BSD4.*,libc4和libc5中都是`int'. 参见 .BR accept (2). .SH "SEE ALSO" .BR fcntl (2), .BR recv (2), .BR select (2), .BR getsockopt (2), .BR sendfile (2), .BR socket (2), .BR write (2), .BR socket (7), .BR ip (7), .BR tcp (7), .BR udp (7) .SH "[中文版维护人]" .B byeyear .SH "[中文版最新更新]" .B 2002.02.27 .SH "《中国linux论坛man手册页翻译计划》:" .BI http://cmpp.linuxforum.net .SH "跋" .br 本页面中文版由中文 man 手册页计划提供。 .br 中文 man 手册页计划:\fBhttps://github.com/man-pages-zh/manpages-zh\fR