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 ...
随机推荐
- MySQL 索引结构 hash 有序数组
MySQL 索引结构 hash 有序数组 除了最常见的树形索引结构,Hash索引也有它的独到之处. Hash算法 Hash本身是一种函数,又被称为散列函数. 它的思路很简单:将key放在数组里,用 ...
- 「疫期集训day0」启程
看了看几乎所有学长都是写的博客,所以写的博客 由于是第一回集训,考得都是老题(虽然有些还不会) 感受1:我调试好蒻呃,调试巨蒻,T1lis模板5分切,结果T2T3T4调了将近了两个小时,先是T2路径输 ...
- day77 vue对象提供的属性功能
目录 一.过滤器 二.计算属性(computed) 三.侦听属性(watch) 四.vue对象的生命周期 五.阻止事件冒泡和刷新页面 六.综合案例-todolist 一.过滤器 定义:就是vue允许开 ...
- Scala 面向对象(四):import
1 Scala引入包基本介绍 Scala引入包也是使用import, 基本的原理和机制和Java一样,但是Scala中的import功能更加强大,也更灵活. 因为Scala语言源自于Java,所以ja ...
- Scala 基础(七):Scala 运算符
1 算术运算符 算术运算符(arithmetic)是对数值类型的变量进行运算的,在Scala程序中使用的非常多. 细节说明: 1)对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留 ...
- POJ 1057 File Mapping 最详细的解题报告
题目来源:POJ 1057 File Mapping 题目大意:像我的电脑那样显示文件夹和文件信息,其中在同一级目录内,文件夹排在文件的前面并且文件夹的顺序不变,同一级目录中文件按字母序排列.文件以‘ ...
- 利用EasyExcel进行对表格数据的写入
一导入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</ ...
- Java应用服务器之tomcat基础配置(一)
前文我们聊到了java相关重要组件和它们之间的关系以及jdk.tomcat部署回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13302938.html:今天我们 ...
- DEBUG ArrayList
1,ArrayList面试必问 说说ArrayList和LinkedList的区别? ArrayList基于数组实现,LinkedList基于链表实现,不同的数据结构决定了ArrayList查询效率比 ...
- Windows File Recovery - 微软官方文件恢复工具
假如你不小心误删除了文件或因各种意外情况丢失数据后,你可以通过 微软这款工具 这个工具来尝试恢复它们.WinFR 工具支持读取本机硬盘.移动硬盘.U 盘,或者连接相机.手机.使用读卡器来恢复 SD.T ...