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 ...
随机推荐
- 一口气说出 OAuth2.0 的四种鉴权方式,面试官会高看一眼
本文收录在个人博客:www.chengxy-nds.top,技术资源共享,一起进步 上周我的自研开源项目开始破土动工了,<开源项目迈出第一步,10 选 1?页面模板成了第一个绊脚石 > , ...
- 调整数组顺序使奇数位于偶数前面(剑指offer-13)
方法1:新建两个数组,一个数组用来放奇数,一个数组用来放偶数,最后再把它们合并起来. 1 import java.util.*; 2 public class Solution { 3 public ...
- MyBatis-Plus 用起来真的很舒服
一.MyBatis-Plus 1.简介 MyBatis-Plus 是一个 Mybatis 增强版工具,在 MyBatis 上扩充了其他功能没有改变其基本功能,为了简化开发提交效率而存在. 官网文档地址 ...
- Layui数据表格动态加载操作按钮
效果: 方法一:绑定模版选择器 <div class="layui-card"> <div class="layui-card-body layui-r ...
- CSS的引入与选择器
CSS的引入与选择器 CSS与HTML的关系 Cascading Style Sheet 即层叠样式表 在上一篇文中,已经介绍了一些非常常用的HTML标签,接下来将步入CSS的学习,如果将单纯HTML ...
- YAML 语言教程与使用案例
YAML语言教程与使用案例,如何编与读懂写YAML文件. YAML概要 YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写.在开发的这种 ...
- MCU 51-1概述
Microcontroller Unit 单片机:将微处理器CPU.存储器(RAM.ROM) .基本输入/输出(I/O) 接口电路和总线接口等组装在一块主机板(即微机主板). 微型计算机:将微处理器C ...
- SSRF漏洞简单分析
什么是SSRF漏洞 SSRF(服务器端请求伪造)是一种由攻击者构造请求,服务器端发起请求的安全漏洞,所以,一般情况下,SSRF攻击的目标是外网无法访问的内部系统. SSRF漏洞形成原理. SSRF的形 ...
- java面试题jvm字节码的加载与卸载
虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换分析和初始化,最终形成可以被虚拟节直接使用的JAVA类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存到卸载出内存的生命周期 ...
- Go Pentester - TCP Proxy
Building a TCP Proxy Using io.Reader and io.Writer Essentially all input/output(I/O). package main i ...