谈谈TCP Socket中读取数据的函数---read、recv、readv

devtools/2024/9/22 18:42:57/

read函数

  1. read函数从文件描述符(包括TCP Socket)中读取数据,并将读取的数据存储到指定的缓冲区中。
  2. 原型 ssize_t read(int fd, void *buf, size_t count);
    -fd:要读取数据的文件描述符,可以是TCP Socket
    -buf:存储读取数据的缓冲区
    -count:要读取的字节数
    -返回值:成功时返回实际读取的字节数,失败时返回-1,并设置errno变量来指示错误的原因。

recv函数

  1. recv函数从TCP Socket中读取数据,并将读取的数据存储到指定的缓冲区中,同步的IO接口。
  2. 原型 ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    -sockfd:要读取数据的套接字描述符,即TCP Socket。
    -buf:存储读取数据的缓冲区。
    -len:要读取的字节数。
    -flags:可选的标志参数,用于控制recv函数的行为。
    -返回值:成功时返回实际读取的字节数,失败时返回-1,并设置errno变量来指示错误的原因,如果size==-1&&errno=EAGAIN或者EWOULDBLOCK表示设置socket为了非阻塞,连接成功但是没有数据,size==0,对方关闭了连接;。

readv函数

  1. readv函数从文件描述符(包括TCP Socket)中读取数据,并将读取的数据存储到指定的多个缓冲区中。
  2. 原型 ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
    -fd:要读取数据的文件描述符,可以是TCP Socket。
    -iov:存储读取数据的多个缓冲区的数组。
    -iovcnt:缓冲区数组的长度。
    -返回值:成功时返回实际读取的字节数,返回0说明没有数据可读了或者到文件尾了;失败时返回-1,并设置errno变量来指示错误的原因。

注意: read函数和recv函数都是阻塞调用,即在没有数据可读时会一直阻塞等待,它们的主要区别在于recv函数可以通过flags参数控制一些特殊的行为,如设置MSG_PEEK标志来预览数据而不将其从缓冲区中移除。而readv函数可以一次读取多个缓冲区中的数据,并在内核中减少了多次系统调用的开销。


http://www.ppmy.cn/devtools/31459.html

相关文章

Delta lake with Java--数据增删改查

之前写的关于spark sql 操作delta lake表的,总觉得有点混乱,今天用Java以真实的数据来进行一次数据的CRUD操作,所涉及的数据来源于Delta lake up and running配套的 GitGitHub - benniehaelen/delta-lake-up-and-running: Companion reposito…

解决clickhouse 启动报错

解决clickhouse 启动报错 Error response from daemon: driver failed programming external connectivity on endpoint clickhouse-server (b42457434cebe7d8ad024d31e4fd28eae2139bb2b5046c283bea17ce4398d5b0): Error starting userland proxy: listen tcp4 0.0.0.0:8123: …

npm ERR! Invalid dependency type requested: alias解决

错误说明: 在使用vue通过npm进行依赖下载的时候出现: npm ERR! Invalid dependency type requested: alias 原因是使用的是nodejs版本比较低,其中附带的npm版本也比较低,较低npm 版本不支持使用别名(alias&#xff0…

SpringCloudAlibaba:3.1dubbo

dubbo 概述 简介 Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题 官方提供了 Java、Golang、Rust 等多语言 SDK 实现 Dubbo的开源故事 最早在2008年,阿里巴巴就将Dubbo捐献到开源社区,它很快成为了国内开源…

Docker搭建LNMP+Wordpress

目录 一.项目模拟 1.项目环境 2.服务器环境 3.任务需求 (1)使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台 (2)限制 Nginx 容器最多使用 500MB 的内存和 1G 的 Swap (3)限制 Mysql 容器写 /d…

利用pytorch两层线性网络对titanic数据集进行分类(kaggle)

利用pytorch两层线性网络对titanic数据集进行分类 最近在看pytorch的入门课程,做了一下在kaggle网站上的作业,用的是titanic数据集,因为想搭一下神经网络,所以数据加载部分简单的把训练集和测试集中有缺失值的列还有含有字符串的…

深度学习之基于Matlab卷积神经网络验证码识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着互联网的发展,验证码作为一种常用的安全验证手段,被广泛应用于各种网站和…

【华为 ICT HCIA eNSP 习题汇总】——题目集19

1、(多选)以下选项中,FTP 常用文件传输类型有()。 A、ASCII 码类型 B、二进制类型 C、EBCDIC 类型 D、本地类型 考点:应用层 解析:(AB) 文件传输协议(FTP&…