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索引的不是套接字

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 位运算符按位取反_计算机基础常见问题讨论

    位运算符按位取反_计算机基础常见问题讨论程序中的所有数在计算机内存中都是以二进制的形式储存的。位操作是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。(摘自维基百科)位运算对CPU很友好,是一种程序优化手段,也是大厂面试中常常会提及的话题。在日常的编程中用到为运算,也是可以实现许…

    2022年8月14日
    3
  • 计算广告概述【计算广告】

    计算广告概述【计算广告】

    2021年5月27日
    146
  • 怎么安装pandas库_python第三方库pandas

    怎么安装pandas库_python第三方库pandas问题现象:PyCharm中运行程序,报错,提示“ModuleNotFoundError:Nomodulenamed’pandas’”第一种方法:1.电脑WIN+R,输入cmd,输入pipinstallpandas,等待下载完成即可。2.如果有以下提示,说明pip的版本可能不一致,需要解决冲突。想更新pip,输入pipinstall–upgradepip,报错,提示“Nomodulenamedpip”3.解决方法,输入python-mensu

    2022年8月29日
    4
  • java培训机构前十_深度java培训学校

    java培训机构前十_深度java培训学校对于想要学Java的人来说,参考深圳Java培训机构排名榜单是最有效率的选择培训机构的方法,随着近些年学Java编程的人数暴增,Java培训市场也得到了极大的发展,Java培训机构数量空前的多,从而市场竞争尤为激烈,各种营销手段层出不穷,让学习者找起来不知所措。而比较权威的深圳Java培训机构排名榜单会起到筛选的作用,很大程度上缩小了选择的范围。因此下面就来一起了解下这份权威的深圳Java培训机构排名榜单,需要的可以参考下。1.深圳动力节点深圳动力节点在Java培训行业还是比较有名的,如果.

    2022年9月28日
    2
  • androidstudio 优化gradle编译效率[通俗易懂]

    androidstudio 优化gradle编译效率

    2022年1月24日
    277
  • 全排列 leetcode_8的全排列

    全排列 leetcode_8的全排列原题链接给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]题解回溯即可class Solution {public: vector<vector<int> >res; vector<int>t; void dfs(int num,int len,vecto

    2022年8月9日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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