首页 > 其他分享 >第十三章 多种I/O复用

第十三章 多种I/O复用

时间:2023-06-13 10:32:26浏览次数:62  
标签:多种 函数 复用 偏移量 紧急 第十三章 MSG 接字 recv


《TCP/IP网络编程》尹圣雨 P211-P225

send & recv函数



Linux中的send & recv


#include<sys/socket.h>  
ssize_t send(int sockfd, const void *buf,size_t nbytes,int flags);

成功时返回发送的字节数,失败时返回-1.


#include<sys/socket.h>  
ssize_t recv(int sockfd,  void *buf,size_t nbytes,int flags);

成功时返回接收的字节数(收到EOF返回0),失败时返回-1.

 

send函数和recv函数的最后一个参数是收发数据时的可选项。该可选项可利用位或运算同时传递多个信息、

 

send、recv函数的可选项及含义

MSG_OOB :用于传输带外数据 Out-of-band data  
MSG_PEEK:验证输入流缓冲中是否存在接收的数据   
MSG_DONTROUTE:数据传输过程中不参照路由表Routing,在本地Local网络中寻找目的地   
MSG_DONTWAIT:调用I/O函数时不阻塞,用于使用非阻塞Non-blocking I/O   
MSG_WAITALL:防止函数返回,直到接收全部请求的字节数



MSG_OOB发送紧急消息

用于发送“带外数据”的紧急消息、用于创建特殊发送方法和通道以发送紧急消息、

fcnt1(recv_sock, F_SETOWN, gitpid());

fcnt1函数用于控制文件描述符,含义如下:“将文件描述符recv_sock指向的套接字拥有者(F_SETOWN)改为把getpid函数返回值用于ID的进程”。


注:操作系统实际创建并管理套接字,“套接字拥有者”是操作系统。此处的“拥有者”是指负责套接字所有事物的主体。

文件描述符recv_sock指向的套接字印发的SIGURG信号处理进程变为将getpid函数返回值用作ID的进程。

 

多个进程可以共同拥有1个套接字的文件描述符。



通过MSG_OOB可选项传递数据时,不会加快数据传输速度,而且通过信号处理函数读取数据只能读1个字节。MSG_OOB含义OUT-OF-DATA,"带外数据",指的是“通过完全不同的通信路径传输的数据”。

真正意义上的Out-pf-band需要单独的通信路径高速传输数据,但TCP不另外提供,只利用TCP的紧急模式进行传输。

 

紧急模式工作原理

MSG_OOB的意义在于督促数据接收对象尽快处理数据。

 

紧急消息传输阶段的输出缓冲

8

9

0

.

.

.

.

偏移量0

 

 

偏移量3

 

 

 

 

将缓冲最做到的位置视作偏移量为0,字符0保存于偏移量为2的位置。偏移量3的位置存有紧急指针UrgentPointer.紧急指针指向紧急消息的下一个位置(偏移量加1),同时向对方主机传递如下信息:紧急指针指向的偏移量为3之前的部分就是紧急消息。

实际上只有1个字节表示紧急消息。


设置URG的数据包

URG=1,URG指针=3

8

9

0

TCP头

TCP头中含有如下两个消息:

URG=1:载有紧急消息的数据包

URG指针:紧急指针位于偏移量为3的位置。

指定MSG_OBB选项的数据包本身就是紧急数据包,并通过紧接指针表示紧急消息所在位置。

 

注意:偏移量就是参照基准位置表示相对位置的量。偏移量表示距离基准点向那个方向偏移多长距离。偏移地址每次从0开始。

 

检查输入缓冲

同时设置MSG_PEEK和MSG_DONTWAIT选项,以验证输入缓冲中是否存在接收的数据。设置MSG_PEEK选项并调用recv函数时,即使读取了输入缓冲数据也不会删除。该选项通常与MSG_DONTWAIT合作,用于调用以非阻塞方式验证待读取数据存在与否的函数。

 

 

readv & writev函数

使用readv & writev函数

功能:对数据进行整合传输及发送的函数。


通过writev函数可以吧分散保存在多个缓冲中的数据一并发送,通过readv函数可以由多个缓冲分别接收。适当使用2个函数可以减少I/O函数的调用次数。

#include<sys/uio.h>  
ssize_t writev(int filedes, const struct iovec *iov, int iovcnt);

成功时返回发送的字节数,失败返回-1


filedes:表示数据传输对象的套接字文件描述符。该函数并不只限于套接字,因此,可以像read函数一样向其传递文件或标准输出描述符。

iov:ioves结构体数组的地址值,结构体iovec中包含待发送数据的位置和大小信息。

iovcnt:向第二个参数传递数组长度。



struct iovec {  
void * iov_base;//缓冲地址   
size_t iov_len;//缓冲大小   
};


下面介绍readv函数,与writev函数正好相反。


#include<sys/uio.h>  
ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);

成功时返回发送的字节数,失败返回-1

 

合理使用readv & writev函数


从 C 角度看,减少函数调用次数也能相应提高性能,但其更大意义在于减少数据包个数。











标签:多种,函数,复用,偏移量,紧急,第十三章,MSG,接字,recv
From: https://blog.51cto.com/u_14939782/6467637

相关文章

  • linux下多种yum repo 创建
    一、使用本地文件1>拷贝镜像文件至mnt目录ISO镜像:CentOS-7-x86_64-DVD-1810mount/dev/sr0/media/cp-r/media/mnt/2>创建local.repo[root@mysql01~]#cd/mnt/[root@mysql01mnt]#cd/etc/yum.repos.d/[[email protected]]#ls163baklocal.repo[root@mysql......
  • Java NIO原理 (Selector、Channel、Buffer、零拷贝、IO多路复用)
    系列文章目录和关于我零丶背景最近有很多想学的,像netty的使用、原理源码,但是苦于自己对于操作系统和nio了解不多,有点无从下手,遂学习之。一丶网络io的过程上图粗略描述了网络io的过程,了解其中的拷贝过程有利于我们理解非阻塞io,以及IO多路复用的必要性。数据从网卡到内核缓......
  • Python实现猜拳小游戏的多种方式
    简介猜拳小游戏是一个经典的小游戏项目,也是初学者学习编程的必要练手题目之一。在Python中,我们可以使用多种方式来实现一个简单的猜拳小游戏。本文将依次介绍六种Python实现猜拳小游戏的方法,包括:使用if-else条件语句、使用random模块、使用字典映射胜负关系、for循环、whi......
  • Python 九九乘法表的多种实现方式
    简介九九乘法表是初学者学习编程的必要练手题目之一,因此各种语言都有对应的实现方式,而Python也不例外。在Python中,我们可以使用多种方式来生成一个简单的九九乘法表。本文共介绍了七种Python实现九九乘法表的方法,包括:双重循环for-for、双重循环while-while、循环嵌套whi......
  • 微软对Beta频道进行功能更新,添加多种中文声音
         日前微软发布适用于Windows11的最新更新,为Beta频道的WindowsInsider项目成员提供了版本号为Build22631的KB5027305更新。并且微软还对Narrator功能进行了优化,使其在浏览网页、阅读ERP内容和撰写邮件等任务时,中文和西班牙语(西班牙和墨西哥)的发音更加自然流畅。......
  • 中文乱码解决(多种方法)(转)
    使用tomcat时,相信大家都回遇到中文乱码的问题,具体表现为通过表单取得的中文数据为乱码。一、初级解决方法通过一番检索后,许多人采用了如下办法,首先对取得字符串按照iso8859-1进行解码转换,然后再按照gb2312进行编码,最后得到正确的内容。示例代码如下:Stringpara=newString......
  • I/O多路复用(select poll epoll)
    select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间select调用后select函数会阻塞,直到有描述符就绪(有数据可读、可写、或者有exce......
  • NIO 是不是就是IO多路复用?NO
    似乎从互联网起源,BIO、NIO的话题就从未间断,无论是平时还是面试。那么他们到底是什么?希望你看完这个文章彻底理解这些概念,同时这边文章也使用Java代码实现一个I/O多路复用的实例,最后到I/O原理。IO是什么?首先要了解什么是I/O,一次网络请求、一次磁盘读取都是I/O,所以可以泛......
  • Hive - 多种表类型的CURD测试
     关于torc、textfile、orc、es、hyperdrive表的CURD测试  TORC(支持事务的orc表)测试TORC(分区表)测试TEXTFILE表测试ORC表测试ES(ElasticSearch表)测试hyperdrive表测试    TORC(支持事务的orc表)测试--torc测试--=======CREATETABLEdefault.torc_test(......
  • 多种工厂模式的运用
    目录一、简单工厂模式(非23种设计模式)1.1结构2.2实现2.2.1简单工厂类图2.2.2代码2.2.3优缺点二、静态工厂模式(非23种设计模式)3.1代码三、工厂模式3.1结构3.2实现3.2.1工厂模式类图3.2.2代码3.2.3优缺点四、抽象工厂模式4.1结构4.2实现4.2.1抽象工厂模式类图4.2.2代码......