Man——send(2)翻译
##纯手打
Man——send(2)
-->NAME:
send, sendto, sendmsg - 在socket上发送一条消息
-->总览:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
-->描述:
系统调用send(), sendto(), and sendmsg()用于传输一条消息到另一个socket。
Send()只可能在socket处于连通状态时使用(只有这样接收者才能收到消息)。
Send()和write(2)唯一的不同在于send()的flags参数。当flags值为0时,send()相当于 write(2)。同样,send(sockfd, buf, len, flags)等效于sendto(sockfd, buf, len, flags, NULL, 0)。
参数sockfd 是发送端socket的文件描述符。
如果sendto()用于SOCK_STREAM, SOCK_SEQPACKET连接模式的socket之上,参数dest_addr 和 addrlen 会被无视(当这两个参数非NULL或非0,调用可能会返回error EISCONN)。
如果socket没有连通则会返回error ENOTCONN。有连通,则对端地址会以addrlen的大小赋值到dest_addr。
对于sendmsg(),则由msg.msg_name给出大小为msg.msg_namelen。
对于send()和 sendto(),要发送的消息存于buf,且长为len。
对于sendmsg(),消息参数msg.msg_iov数组指定。
Sendmsg()也可以用来发送辅助性的数据(即控制信息)。
如果消息太长以至于不能原子性地通过底层的协议,会返回error EMSGSIZE,并且消息不会被传输。
No indication of failure to deliver is implicit in a send().(??)。返回-1表明本地调用的错误。
当消息的大小与发送缓冲不匹配时,send()一般会阻塞,除非socket的创建为nonblocking I/O模式。对于非阻塞模式,这种情况则会失败并返回 error EAGAIN or EWOULDBLOCK。
Select(2)调用可以决定什么是否发送更多数据。
参数flags是0或以下更多标记的按位或运算结果:
·MSG_CONFIRM (since Linux 2.3.15)
告诉连接层:你成功收到对端的响应。如果连接层没有收到这个标记,它会不断地再次探测neighbor(??)(譬如通过ARP单播。
只在SOCK_DGRAM 和SOCK_RAW sockets可用,而且当且只在IPv4 和IPv6上实现了。详见 arp(7) f。
· MSG_DONTROUTE
不使用网关发送包,直接通过直连的网络发送到主机。这一般只用于诊断网络或路由的程序。这个只为需要路由的协议族定义了。This is defined only for protocol families that route; packet sockets don't.(??)
·MSG_DONTWAIT (since Linux 2.2)
允许非阻塞操作,如果操作是阻塞的,会返回 EAGAIN或 EWOULDBLOCK (这也可以通过F_SETFL fcntl(2)设置O_NONBLOCK实现。)
·MSG_EOR (since Linux 2.2)
Terminates a record(??) (如果支持这个标记,对SOCK_SEQPACKET类型的sockets 有效)。
·MSG_MORE (Since Linux 2.4.4)
调用者需要发送更多数据。这个标记配合TCP sockets使用,取得同TCP_CORK socket 选项的效果,不同的是这个标记是单次调用生效的。
自Linux 2.6后, 这个标记也支持UDP sockets,而且会通知内核,将带有这个标记的send调用打包到一个数据报里,这些数据只有在不带这标记的send调用中才会被发送。(See also the UDP_CORK socket option described in udp(7).)
·MSG_NOSIGNAL (since Linux 2.2)
请求在流sockets的使用中,当对端断开连接引起错误时不发送SIGPIPE。而仍然返回可能会EPIPE error。
·MSG_OOB
在支持这个标记的sockets上发送带外数据。(如SOCK_STREAM); 底层的协议也必须支持带外数据。
Msghdr结构如下。关于结构属性的更多描述参见recv(2) 和下述。
struct msghdr {
void *msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
size_t msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data, see below */
size_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};
你可以用 msg_control 和msg_controllen的成员发送控制信息。对每个socket,内核可处理的最大的控制缓冲长度由socket by the value in /proc/sys/net/core/optmem_max限制。见socket(7)。
-->返回值
成功返回成功发送的字符数。错误则返回-1,且设置适当的errno。
-->ERRORS
一下这些是sockets层生成的标准错误。其他错误可能会由底层 的协议模块生成和返回。参见各自的man手册页。
·EACCES (对unix域sockets有效,由路径名区分)
对目的socket 文件没有写权限,或者对某些目录路径的前缀没有搜索权限。 (参见path_resolution(7).)
(对UDP sockets)在单播地址上作出 网络/广播地址的操作。
·EAGAIN or EWOULDBLOCK
Socket被标记为nonblocking(非阻塞),而请求的操作会导致阻塞。此时,POSIX.1-2001规定允许返回这个两个错误标记,并且并不要求两个常量有相同的值,所以可移植应用应同时检查两个可能的值。
·EBADF 声明了一个无效的文件描述符
·ECONNRESET 对端重置了连接
·EDESTADDRREQ socket不是连接模式,且没有设置对端地址
·EFAULT 设置了无效客户端地址
·EINTR 在传输数据前收到信号,见signal(7).
·EINVAL 无效参数
·EISCONN 连接模式的socket 已连接,但收件人已指定。(这种情况下,要不返回这个错误,要不忽略接收者的指定)
·EMSGSIZE socke的类型要求消息原子性地发送,但要发送的消息的大小使这次调用无效
·ENOBUFS 网络接口的输出队列已满。这一般说明了接口已停止已停止发送,但也可能是瞬间的阻塞造成(一般不会发生在Linux上,当设备队列溢出时Linux的行为一般是静默地弃包)。
·ENOMEM 没有可用内存
·ENOTCONN socket没有连接,且没有给定目标
·ENOTSOCK 参数sockfd 不是socket文件
·EOPNOTSUPP flags参数设置与socket类型冲突
·EPIPE 本地关闭了面向连接的socket。此时,程序会收到SIGPIPE 除非设置MSG_NOSIGNAL
-->符合4.4BSD, SVr4, POSIX.1-2001. 这些函数出现在4.2BSD.
POSIX.1-2001 只描述了MSG_OOB 和MSG_EOR标记。 POSIX.1-2008 添加了MSG_NOSIGNAL的声明。MSG_CONFIRM 标记是 Linux 的扩展。
-->BUGS
Linux可能返回 EPIPE而不是 ENOTCONN.
Man——send(2)翻译的更多相关文章
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...
- [翻译+山寨]Hangfire Highlighter Tutorial
前言 Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows ...
- kettle系列-6.kettle实现多字段字典快速翻译
在数据清洗转换中,常见的字典翻译,如性别在原表中是1(男).2(女)等,类似还有很多较大的字典需要翻译,若同一个表中有很多个字典需要翻译,采用[数据库查询]方式翻译的话效率就会相当低下. 这里采用ja ...
- 翻译-使用Ratpack和Spring Boot打造高性能的JVM微服务应用
这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices with Ratpack & Spring Boot,InfoQ上的中 ...
- 搞懂 SynchronizationContext(第一部分)【翻译】
SynchronizationContext -MSDN 很让人失望 我不知道为什么,目前在.Net下关于这个类只有很少的资料.MSDN文档也只有很少的关于如何使用SynchronizationCon ...
- dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.
http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术 ...
- 【翻译】DotNetMQ: 一个.NET版完整的消息队列系统
在一个大型的分布式系统中,消息队列是不可缺少的中间件,能很好的解决异步消息.应用解耦.均衡并发等问题.在.net中,偶然发现一个效率不错.安全可靠.功能齐全的消息组件,忍不住翻译过来,供大家快速预览. ...
- CQRS FAQ (翻译)
我从接触ddd到学习cqrs有6年多了, 其中也遇到了不少疑问, 也向很多的前辈牛人请教得到了很多宝贵的意见和建议. 偶尔的机会看到国外有个站点专门罗列了ddd, cqrs和事件溯源的常见问题. 其中 ...
随机推荐
- Web开发中20个很有用的CSS库
来源: 微信公众号文章 在过去的几年中,CSS已经成为一大部分开发者和设计者的最爱,因为它提供了一系列功能和特性.每个月都有无数个围绕CSS的工具被开发者发布以简化WEB开发.像CSS库,框架,应用这 ...
- boost字符串算法
boost::algorithm简介 2007-12-08 16:59 boost::algorithm提供了很多字符串算法,包括: 大小写转换: 去除无效字符: 谓词: 查找: 删除/替换: 切割: ...
- venus
The Venus system was a small timesharing system serving five or six users at a time:分时系统 The design ...
- web应用动态文档技术
动态生成web文档分为服务器动态生成.客户端动态生成 服务器动态生成文档技术主要有: CGI - 公共网关接口,它是一个允许Web服务器与后端程序以及脚本进行通信的标准化接口.通常是web服务器收到一 ...
- 解决JS加载速度慢
在网页中的js文件引用会很多,js引用通常为 <script src="xxxx.js"></script> 通过如下方法可以增加js加载速度 <sc ...
- 【java项目小记--JManager】项目开始原因及github部署
--记于2016-8-11 毕业已三载,忽然想起大学时的毕业设计项目,想到曾在毕业答辩上说,会吸取老师点评并逐渐完善该项目.而今 老师点评已忘了个干净,项目也还是毕业时的样子,正好最近有些时间,打算兑 ...
- Android 防止OOM优化
1. Android2.x及以下的系统优化: Bitmap被解码后的像素被存储在Native Heap中, Dalvik Heap有个external计数,记录了Bitmap所占用的内存. 当 Dal ...
- Discuz 网站移至 Ubuntu 14.04.4 LTS VPS 配置
查看 当前系统版本信息 复制命令:lsb_release -a 1.首先更新本地软件库索引 复制命令:apt-get update 2.安装apache2 复制命令:apt-get install ...
- USB通信协议——深入理解
USB通信协议——深入理解 0. 基本概念 一个[传输](控制.批量.中断.等时):由多个[事务]组成: 一个[事务](IN.OUT.SETUP):由一多个[Packet]组成. USB数据在[主机软 ...
- 开发一个简单的python计算器
要求: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4* ...