linux内核 recvfrom,Linux系统调用– recv/recvfrom 函数详解

linux内核 recvfrom,Linux系统调用– recv/recvfrom 函数详解Linux系统调用–recv/recvfrom函数详解功能描述:从套接字上接收一个消息。对于recvfrom,可同时应用于面向连接的和无连接的套接字。recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃。假如套接字上没有消息可以读取,除了套接字已被设置为非阻…

大家好,又见面了,我是你们的朋友全栈君。

Linux系统调用– recv/recvfrom函数详解

功能描述:

从套接字上接收一个消息。对于recvfrom,可同时应用于面向连接的和无连接的套接字。recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。

如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃。

假如套接字上没有消息可以读取,除了套接字已被设置为非阻塞模式,否则接收调用会等待消息的到来。

用法:

#include

#include

ssize_t recv(int sock, void *buf, size_t

len, int flags);

ssize_t recvfrom(int sock, void *buf,

size_t len, int flags,

struct sockaddr *from, socklen_t *fromlen);

参数:

sock:索引将要从其接收数据的套接字。

buf:存放消息接收后的缓冲区。

len:buf所指缓冲区的容量。

flags:是以下一个或者多个标志的组合体,可通过or操作连在一起

MSG_DONTWAIT:操作不会被阻塞。

MSG_ERRQUEUE:指示应该从套接字的错误队列上接收错误值,依据不同的协议,错误值以某种辅佐性消息的方式传递进来,使用者应该提供足够大的缓冲区。导致错误的原封包通过msg_iovec作为一般的数据来传递。导致错误的数据报原目标地址作为msg_name被提供。错误以sock_extended_err结构形态被使用,定义如下

#define SO_EE_ORIGIN_NONE0

#define SO_EE_ORIGIN_LOCAL1

#define SO_EE_ORIGIN_ICMP2

#define SO_EE_ORIGIN_ICMP63

struct sock_extended_err

{

u_int32_t ee_errno;/* error number */

u_int8_t ee_origin;

/* where the error originated */

u_int8_t ee_type;/* type */

u_int8_t ee_code;/* code */

u_int8_t ee_pad;

u_int32_t

ee_info;/* additional information */

u_int32_t ee_data;/* other

data */

/* More data may follow */

};

MSG_PEEK:指示数据接收后,在接收队列中保留原数据,不将其删除,随后的读操作还可以接收相同的数据。

MSG_TRUNC:返回封包的实际长度,即使它比所提供的缓冲区更长, 只对packet套接字有效。

MSG_WAITALL:要求阻塞操作,直到请求得到完整的满足。然而,如果捕捉到信号,错误或者连接断开发生,或者下次被接收的数据类型不同,仍会返回少于请求量的数据。

MSG_EOR:指示记录的结束,返回的数据完成一个记录。

MSG_TRUNC:指明数据报尾部数据已被丢弃,因为它比所提供的缓冲区需要更多的空间。

MSG_CTRUNC:指明由于缓冲区空间不足,一些控制数据已被丢弃。

MSG_OOB:指示接收到out-of-band数据(即需要优先处理的数据)。

MSG_ERRQUEUE:指示除了来自套接字错误队列的错误外,没有接收到其它数据。

from:指向存放对端地址的区域,如果为NULL,不储存对端地址。

fromlen:作为入口参数,指向存放表示from最大容量的内存单元。作为出口参数,指向存放表示from实际长度的内存单元。

返回说明:

成功执行时,返回接收到的字节数。另一端已关闭则返回0。失败返回-1,errno被设为以下的某个值

EAGAIN:套接字已标记为非阻塞,而接收操作被阻塞或者接收超时

EBADF:sock不是有效的描述词

ECONNREFUSE:远程主机阻绝网络连接

EFAULT:内存空间访问出错

EINTR:操作被信号中断

EINVAL:参数无效

ENOMEM:内存不足

ENOTCONN:与面向连接关联的套接字尚未被连接上

ENOTSOCK:sock索引的不是套接字

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163449.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • IntelliJ idea 主题包下载以及安装

    IntelliJ idea 主题包下载以及安装IntelliJidea默认的主体只有简单的白和灰,不一定能满足所有人的喜好,所以想要下载一些其它不错的主题包;主题下载地址;部分截图;选择自己喜欢的主题下载,个人还是比较喜欢SublimeText2主题,下载好之后,随意放个找得到的位置(还是放在安装目录下面吧,是个整体嘛),是个jar包。安装:file–>importsetttings–…

  • 动态链接库(DLL)初始化例程失败_load dll error解决

    动态链接库(DLL)初始化例程失败_load dll error解决UnabletoloadDLL’rasapi32.dll’:动态链接库(DLL)初始化例程失败。(ExceptionfromHRESULT:0x8007045A)解决方法:应用程序池-标识-选本地系统或者输入管理员身份的账户

  • PHP正则表达式_python正则匹配字母

    PHP正则表达式_python正则匹配字母一、正则表达式语法(Perl风格)1、模式规则  /php/字符串前后加上两条斜杠即可2、匹配函数  preg_match(‘/php/’,php)  参数1模式  参数2字符串二、正则表达式中的元素介绍  1、正则表达式中包含三种元素分别为:量词、元字符、修饰符  2、前导字符串:就是符号前面的一个字符或字符串量词…

    2022年10月22日
  • 制作zencart模板的几个步骤

    制作zencart模板的几个步骤很多做外贸站的朋友都在为自己的网店模板而头疼不已,本来踌躇满志的要好好做网站,但是当你用网店程序的时候,发现zencart程序里面默认的模板都不怎么好看。于是乎,四处寻找,找了这个想要那个,结果不是不能用就是功能不全。而且最大的威胁就是不安全,万一有个什么其他的代码嵌在里面,你也发现不了。这对于做外贸的你来说是得不偿失的,那么,你是否想要自己做一个你喜欢的模板呢?是不是苦于没有方法呢?易搜今天就来…

  • 微型计算机原理与接口技术知识点总结_微型计算机接口技术答案

    微型计算机原理与接口技术知识点总结_微型计算机接口技术答案记得刚要上这门课的时候,学长就跟说这是一门很重要很有用的课程,对经后的一些课程设计或者是做一些项目之类的都有很大的帮助,特别是对毕业就想找工作的人来说学会单片机就更重要了,所以我一直都很认真的在听课,但是由于去参加北京市的电子设计大赛,老师允许我们不用做这门课的实验,再加上这门课平时就没有什么要做的作业之类的,练得太少了,可以说几乎没有实践的机会,也因此对所学的知识不知道该怎么运用,只是简单的停留…

  • 常见外包公司汇总[通俗易懂]

    常见外包公司汇总[通俗易懂]1.博朗软件Bleum(上海)2.中软国际(北京)3.东软集团Neusoft(沈阳)4.博彦科技BeyondSoft(北京)5.中电金信(北京)6.法本信息(深圳)7.浙大网新Insigma(杭州)8.奥博杰天Objectiva(北京)9.浪潮Inspur(济南)10.软通动力iSoftStone(北京)11.福瑞博德Freeborders(深圳)12.信必优Symbio(北京)13.大展科技Achievo(深圳)14.恒生电子hundsun(杭州)15.日电卓越软

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号