版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第九章,数据输入输出和重用,主要包括以下内容:介绍常用的输入输出函数recv()/send()、readv()/writev()、recvmsg()/sendmsg(),并说明这些函数的主要应用场合,例如recvmsg()可以用于在多个缓冲区中接收和设置选项。几个简单的例子用来说明如何使用上述功能来设计程序。本文介绍了几种常用的输入输出模型,并用图形进行了说明。介绍select()和pselect()函数,以及如何使用这两个函数来监控文件描述符的读写情况。简要介绍了poll()和ppoll()函数的含义、用途和区别。用简单的例子介绍非阻塞编程的方法。Linux操作系统中的IO功能主要包括读()
2、、写()、读()和写()等。本节介绍了上述主要功能,其中读取()和写入()功能之前已经介绍过。9.1.1 recv()用于接收数据。recv()用于接收数据。该功能的原型如下。函数recv()从套接字s接收数据,并将其放入缓冲区buf,buf的长度为len,操作模式由标志指定。第一个参数是windows套接字文件描述符,它由系统调用套接字()返回。第二个参数buf是指向接收网络数据的缓冲区的指针。第三个参数len以字节表示接收缓冲区的大小。# include # include ssize _ t recv(int s,void *buf,size_t len,int flags);9.1.2
3、使用send()发送数据,使用send()函数发送数据。该功能的原型如下。函数send()通过套接字文件描述符以标志指定的方式发送缓冲区buf中的len大小的数据。当发送函数的返回值小于len时,表示缓冲区中仍有一些数据没有成功发送。此时,有必要重新发送剩余的数据。发送剩余数据的通常方法是将原始buf中的数据位置偏移成功发送的字节数。# include # include ssize _ t send(int s,const void *buf,size_t len,int标志);9.1.2使用send()发送数据,9.1.3使用readv()接收数据,函数readv()可以用来接收多个缓冲区
4、的数据,并且函数的原型如下。函数readv()从套接字描述符s中读取计数块数据,并将其放入缓冲区向量# includesize _ t readv (int s,const structiovec * vector,int count);9.1.3使用readv()接收数据,9.1.4使用writev()发送数据。函数writev()可用于从多个缓冲区接收数据。该功能的原型如下。函数writev()将存储在向量向量中的计数块数据写入套接字描述符.#包括ssize_t writev(int fd,const struct iovec *vector,int count);9.1.5 recvms
5、g()用于接收数据,recvmsg()用于接收数据。与recv()和readv()相比,此功能更加复杂。1个函数recvmsg()原型意味着2个地址结构msghdr 3个函数recvmsg()用户空间和内核空间之间的交互,9.1.5使用recvmsg()接收数据,9.1.6使用sendmsg()发送数据,函数sendmsg()可以用来接收多个缓冲区数据,函数的原型如下。函数sendmsg()根据结构msg的设置将数据写入套接字描述符,其中操作模式由标志指定。#包括ssize_t sendmsg(int s,const struct msghdr *msg,int标志);9 . 1 . 7 io
6、功能的比较,表9.8显示了上述功能在使用时的特性,标记为具有这些属性。下列常规函数read()/write()和readv()/writev()可用于所有文件描述符;Recv()/send()、recvfrom()/writeto()和recvmsg/sendmsg只能操作套接字描述符。函数readv()/writev()和recvmsg()/sendmsg()可以操作多个缓冲区,而read()/write()、recv()/send()和recvfrom()/sendto()只能操作一个缓冲区。函数recv()/send()、recvfrom()/sendto()和recvmsg()/sen
7、dmsg()有可选标志。函数recvfrom()/sendto()和recvmsg()/sendmsg()可以选择彼此的IP地址。recvmsg()/sendmsg()函数具有可选的控制置信度,可以执行高级操作。,9 . 1 . 7 io功能的比较,9.2使用IO功能的示例,典型的IO功能在9.1小节中介绍,并且在本小节中给出了上述功能的编程示例。包括典型的send()/recv(),writev()/readv(),sendmsg()/recvmsg()。9.2.1客户端处理框架示例,客户端处理程序是一个程序框架,它为以下三种类型的发送和接收功能建立了基本框架。1客户端程序框架2客户端程序框
8、架代码,9.2.1客户端处理框架示例,以及9.2.2服务器程序框架,这是一个为以下三种收发器功能建立基本架构的程序框架。函数process_conn_server()是服务器端处理函数,不同的收发器函数有不同的实现。9.2.3使用recv()和send()函数,以下代码是使用recv()和send()函数发送和接收网络数据时服务器和客户端的实现代码。1服务器端实现代码2客户端处理代码3信号SIGINT处理函数4信号SIGPIPE处理函数,9.2.4使用readv()和write()函数,使用下列代码代替9.2.1中的process_conn_server()和process_conn_clie
9、nt(),并使用readv()和writev()进行读写。1服务器端实现代码2客户端处理代码3信号SIGINT处理函数4信号SIGPIPE处理函数,9.2.5使用recvmsg()和sendmsg()函数,使用以下代码代替9.2.1中的process_conn_server()和process_conn_client(),并使用recvmsg()和sendmsg()进行读写。1个服务器端实现代码2个客户端处理代码3个信号SIGINT processing functIOn 4个信号SIGPIPE processing functIOn,9.3。io模式,io模式包括阻塞IO、非阻塞IO模式、I
10、O复用、信号驱动、异步IO等。本节以UDP为例介绍了几种io模型。9.3.1阻塞输入输出模型,这是最常见的输入输出类型。当使用这个模型接收数据时,程序将一直等到数据到达。9.3.2非阻塞IO模式,当套接字设置为非阻塞IO时,内核不会阻塞每个请求,并将立即返回;当没有数据时,将返回一个错误。9.3.3输入输出多路复用,使用输入输出多路复用模型,可以在等待时添加超时。当超时未达到时,这与阻塞情况一致。当超时达到并且没有接收到数据时,系统将返回并停止等待。select()函数根据一定的超时进行轮询,直到数据从需要等待的套接字到达,并使用recvfrom()函数将数据复制到应用层。9.3.4信号驱动输
11、入输出模型。信号驱动的输入输出在进程开始时为信号处理注册一个回调函数,进程继续执行。当信号出现时,将有输入输出时间,数据将到达这里。注册的回调函数将用于接收recvfrom()的传入函数。9.3.5异步输入输出模式,异步输入输出类似于以前的信号驱动输入输出,区别在于当数据到来时,信号驱动输入输出使用信号通知注册的信号处理功能,而异步输入输出仅在数据复制完成时发送信号通知注册的信号处理功能。9.4 select()和PSE select()函数、select()和PSE select()函数用于IO多路复用,它们监视多个文件描述符的收集并判断是否有合格的时间。9.4.1选择()函数,它不同于以前
12、的recv()和send()直接操作文件描述符。使用select()函数,您可以查询要操作的文件描述符,查看目标文件描述符是否可以被读取、写入或错误操作,然后在文件描述符满足操作条件时执行真正的输入输出操作。介绍1功能选择()2功能选择()的例子9.4.2功能选择()功能选择()是以超时循环方式检查文件读写错误的可操作性。在Linux下,有一个类似的函数pselect()。函数pseelect()的介绍函数pseelect()的两个示例9.5 poll()函数除了使用select()来监视文件描述符之外,还有一组函数也可以完成类似的功能,即函数poll()和函数ppoll()。9.5.1 po
13、ll()函数,函数poll()等待文件描述符上的事件。原型如下:#包括内部轮询(结构轮询* FDS,nfds _ t nfds,内部超时);函数poll()监视由fds数组指示的一组文件描述符上发生的操作,并在满足条件或超过超时时间时退出。参数fd是指向结构pollfd数组的指针,被监控的文件描述符和条件放置在该数组中。参数nfds的值比监控的最大描述符大1。参数超时是以毫秒为单位的超时时间。当它是消极的,它意味着永远等待。9.5.1轮询()函数,9.5.2轮询()函数,类似于选择()和选择(),还有一个对应于轮询()的轮询()函数,其定义如下:#包括内部轮询* FDS,nfds _ 9.6非
14、阻塞编程。上面介绍的输入输出编程基本上是基于阻塞模式的。在阻塞模式下,当文件中没有数据时,函数不会返回,而是等到数据到达。本节介绍文件无阻塞模式的程序设计。9.6.1非阻塞模式编程介绍非阻塞模式操作与阻塞模式操作的最大区别在于,无论数据是成功读取还是成功写入,函数调用都会立即返回。使用fcntl()根据以下代码设置套接字文件描述符后,可以执行非阻塞编程:其中s是套接字文件描述符,使用F_SETFL命令将套接字s设置为非阻塞模式后,可以在读写后立即返回。9.6.2非阻塞编程的例子,函数accept()可以以非阻塞的方式轮询并等待客户端的到来,并且应该在之前设置NON_BLOCK模式。下面的代码通过轮询使用accept()和recv()函数。当客户端发送“HELLO”字符串时,它会向客户端发送“OK”响应并关闭客户端。当客户端向服务器发送“关机”字符串时,服务器向客户端发送“BYE”,关闭客户端,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 叉车维修服务合同协议2026年标准版
- 员工三级安全教育培训规范
- 收银系统操作流程规范手册
- 奶牛产后子宫恢复管理规程
- 柑橘果园机械化采收分拣技术操作规范
- 花椰菜高垄栽培操作指引
- 养老护理员交接班记录填写规范
- 养生药膳食材采购规范
- 高价值客户维护服务方案
- 理疗师绩效考核方案
- 2026浙江省知识产权保护中心工作人员招聘6人备考题库及一套完整答案详解
- 2026浙江大学“一带一路”国际医学院行政部门招聘2人备考题库(2026年第6批)附答案详解(培优)
- 2026年度省综合专家库评标专家继续教育培训试题及答案解析
- 2026年江西省水投工程咨询集团有限公司社会招聘11人笔试备考试题及答案解析
- 河北省秦皇岛市海港区2025-2026年九年级下一模化学试卷(含答案)
- GB/Z 177.9-2026人工智能终端智能化分级第9部分:耳机
- AQ3062-2025《精细化工企业安全管理规范》专项检查表
- 消化内科慢性胰腺炎的饮食指导
- AQ 3067-2026 《化工和危险化学品生产经营企业重大生产安全事故隐患判定准则》解读
- 2026年装备技术服务计划
- JB/T 20176-2017汽化过氧化氢灭菌传递舱
评论
0/150
提交评论