recv & recvfrom
#include <sys/types.h>
#include <sys/socket.h> ssize_t recv(int sockfd, void *buf, size_t len, int flags); ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
recv(),recvfrom()调用被用于从套接字接收消息。 它们可用于在无连接和面向连接的套接字上接收数据。正如,recv()和read()之间的唯一区别是标志的存在,使用零标志参数时,recv()通常等效于read()。同理,recv(sockfd,buf,len,flags)等价于recvfrom(sockfd,buf,len,flags,NULL,NULL)。
成功完成后,这两个调用都将返回消息的长度。 如果消息太长而无法容纳在提供的缓冲区中,则多余的字节可能会被丢弃,此时,返回值则取决于接收消息的套接字类型。
如果套接字上没有可用的消息,则接收调用将等待消息到达,除非套接字是非阻塞的,在这种情况下,将返回值-1且外部变量errno设置为EAGAIN 或EWOULDBLOCK。 接收呼叫通常返回任何可用数据,最多至请求的数量,而不是等待收到请求的全部数量。
flags参数
flags参数是通过对以下一个或多个值进行“或”运算形成。
MSG_CMSG_CLOEXEC 仅仅recvmsg()函数使用。
MSG_DONTWAIT 启用非阻塞操作。 这提供与设置O_NONBLOCK标志类似的行为(通过fcntl(2)F_SETFL操作),但不同之处在于MSG_DONTWAIT是每个通话选项,而O_NONBLOCK是设置打开文件描述,这将影响在调用进程中的所有线程以及保存了同一文件描述符的其他进程。
MSG_ERRQUEUE This flag specifies that queued errors should be received from the socket error queue.
MSG_OOB 这个标志请求接收正常数据流中不会接收到的带外数据。 一些协议将加急数据放在普通数据队列的开头,因此这标志不能与此类协议一起使用。
MSG_PEEK 这个标志使接收操作从接收队列的开头返回数据,而不会从队列中删除该数据。 因此,后续的接收呼叫将返回相同的数据。
MSG_TRUNC 对于原始(AF_PACKET),Internet数据报,netlink和UNIX数据报套接字:返回数据包或数据报的实际长度,即使它比传递的缓冲区长。
MSG_WAITALL 这个标志导致请求阻塞,直到满足完整请求为止。 但是,如果捕获到信号,发生错误或断开连接,或者下一个要接收的数据与返回的数据类型不同,则呼叫返回的数据仍可能比请求的少。 这个标志对数据报套接字无效。
recvfrom()
recvfrom()将收到的消息放入缓冲区buf。 调用者必须指定缓冲区的大小。如果src_addr不为NULL,并且底层协议提供消息的源地址,则该源地址位于src_addr指向的缓冲区中。 在这种情况下,addrlen是一个值结果参数( a value-result argument)。 在调用之前,应将其初始化为src_addr缓冲区的大小。 返回时,addrlen则为源地址的实际大小。 如果提供的缓冲区太小,返回的地址将被截断。 在这种情况下,addrlen将返回一个大于提供给调用的值。如果调用方对源地址不感兴趣,则src_addr和addrlen应该指定为NULL。
recv()
recv()调用通常仅在面向连接的套接字上使用,等效于调用:recvfrom(fd,buf,len,flags,NULL,NULL)。
返回值
这些调用返回接收到的字节数,如果发生了错误则返回-1。 如果发生错误,则将errno设置为指示错误。当流套接字对等方执行有序关闭时,返回值将为0(传统的“文件结束”返回)。各个域中的数据报套接字允许零长度的数据报。 收到这样的数据报后,返回值为0。如果请求从流套接字接收的字节数为0,则也可能返回值0。
recv & recvfrom的更多相关文章
- socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto
socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...
- recv,recvfrom,send,sendto
一般情况下:send(),recv()用于TCP,sendto()及recvfrom()用于UDP 但是send(),recv()也可以用于UDP,sendto()及recvfrom()也可以用于TC ...
- C语言sendto()函数-经socket传送数据以及recvfrom函数《转》
相关函数:send, sendmsg, recv, recvfrom, socket 头文件:#include <sys/types.h> #include <sys/socke ...
- Tcp Socket非阻塞recv
最近看了许多关于网络编程的资料,自己小记一下,以方便以后查找. 什么是阻塞socket,什么是非阻塞socket.对于这个问题,我们要先弄清什么是阻塞/非阻塞.阻塞与非阻塞是对一个文件描述符指定的文件 ...
- 接口处理篇 accept bind connect atan2 htons inet_addr inet_aton inet_ntoa listen ntohl recv send sendto socket
accept(接受socket连线) 相关函数 socket,bind,listen,connect 表头文件 #include<sys/types.h> #include<sys/ ...
- 一文彻底搞通TCP之send & recv原理
接触过网络开发的人,大抵都知道,上层应用使用send函数发送数据,使用recv来接收数据,而send和recv的实现原理又是怎样的呢? 在前面的几篇文章中,我们有提过,TCP是个可靠的.全双工协议.其 ...
- 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- C++ 系列:socket 资料收集
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- python之协程与IO操作
协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...
随机推荐
- POJ3040贪心
题意:作为创纪录的牛奶生产的奖励,农场主约翰决定开始给Bessie奶牛一个小的每周津贴.FJ有一套硬币N种(1≤N≤20)不同的面额,每枚硬币是所有比他小的硬币面值的倍数,例如1美分硬币.5美分硬币. ...
- 从零开始学Electron笔记(一)
前端技术在最近几年迅猛发展,在任何开发领域我们都能看到前端的身影,从PC端到手机端,从APP到小程序,似乎前端已经无所不能,这就要求我们需要不断地去学习来提升自己!前段时间尤大通过直播介绍了一下Vue ...
- DLL注入之修改PE静态注入
DLL注入之修改PE静态注入 0x00 前言 我们要注入的的力量功能是下载baidu首页数据.代码如下: #include "stdio.h" #include"stdi ...
- 线下---复习day03
目录 django回顾 1 web应用,http协议,web框架 2 django请求生命周期 3 路由控制 4 视图层 5 模板层 6 模型层 django回顾 1 web应用,http协议,web ...
- devtools 判断类数组的方法
var obj = { '2': 3, '3': 4, 'length': 2, 'splice': Array.prototype.splice, 'push': Array.prototype.p ...
- Java标识符/数据类型,规范等详解
Java标识符 类名/变量名/方法名都称之为标识符. Java 所有的组成部分都需要名字.类名.变量名以及方法名都被称为标识符. 关于 Java 标识符,有以下几点需要注意: 所有的标识符都应该以字母 ...
- CSS学习之选择器优先级与属性继承
CSS学习之选择器优先级与属性继承 选择器优先级 其实选择器是具有优先级的,我们来看下面这一组案例: <!DOCTYPE html> <html lang="en" ...
- 数据可视化之DAX篇(二)Power BI中的度量值和计算列,你搞清楚了吗?
https://zhuanlan.zhihu.com/p/75462046 对于初学者,总是会把度量值和计算列搞混,我也经常碰到这样的问题,有些星友用文章中的代码总是报错,发给我一看,才知道TA把本来 ...
- JMeter-一个接口的返回值作为输入传给其他接口
背景: 在用JMeter写接口case,遇到一种情况,接口1查看列表接口,接口2查看详情接口,接口2需要传入接口1列表的第一条数据的id 解决方案: 首先放一下总体截图 具体步骤 1-新建一个Thre ...
- JavaScript动画实例:曲线的绘制
在“JavaScript图形实例:曲线方程”一文中,我们给出了15个曲线方程绘制图形的实例.这些曲线都是根据其曲线方程,在[0,2π]区间取一系列角度值,根据给定角度值计算对应的各点坐标,然后在计算出 ...