概述

#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_control msg_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  

最新文章

  1. Angularjs -Promise - $http
  2. H5 学习笔记(一、关于position定位)
  3. javascript严格模式下的8点规则
  4. item2,实现singleton模式
  5. Swift—重写-备
  6. ArcGIS制图表达Representation-符号制作
  7. 【技术解密】SequoiaDB分布式存储原理
  8. 团队作业4——第一次项目冲刺(Alpha版本)2017.4.28
  9. Postfix+dovecot搭建简单邮箱服务器
  10. 章节二、1-java概述-数据类型
  11. [转帖]震惊,用了这么多年的 CPU 利用率,其实是错的
  12. AGC 014E.Blue and Red Tree(思路 启发式合并)
  13. ABBYY PDF Transformer+安装教程
  14. HTTP基础知识2
  15. Spark Streaming笔记
  16. 学习 python 编写规范 pep8 的问题笔记
  17. Docker应用系列(六)| 如何去掉sudo及避免权限问题
  18. 40道Java基础常见面试题及详细答案
  19. golang广度优先算法-走迷宫
  20. P1488 肥猫的游戏

热门文章

  1. 【Leetcode周赛】从contest-111开始。(一般是10个contest写一篇文章)
  2. SpringBoot集成H2database
  3. centos7安装nginx并配置web前端环境。
  4. java 根据excel模板导出文件
  5. webpack使用问题记录
  6. 在python3.7下怎么安装matplotlib与numpy
  7. flutter页面布局一
  8. 22 October in 614
  9. Django中的get()和filter()区别
  10. wsl中加载git之后,发现文件是修改状态