《数据的IO和复用》PPT课件.ppt

上传人:za****8 文档编号:3169395 上传时间:2019-12-06 格式:PPT 页数:37 大小:514.01KB
返回 下载 相关 举报
《数据的IO和复用》PPT课件.ppt_第1页
第1页 / 共37页
《数据的IO和复用》PPT课件.ppt_第2页
第2页 / 共37页
《数据的IO和复用》PPT课件.ppt_第3页
第3页 / 共37页
点击查看更多>>
资源描述
第9章数据的IO和复用,主要包含如下内容:介绍常用的IO函数recv()/send()、readv()/writev()、recvmsg()/sendmsg(),并讲解函数的主要应用的场合,例如recvmsg()可以用于接收在多个缓冲区中,可以设置选项。用几个简单的例子,说明如何使用上述函数进行程序的设计。介绍常用的几种IO模型,以图形式的方法形象的进行了说明。介绍select()和pselect()函数、如何使用这两个函数进行文件描述符读写条件的监视。简单介绍函数poll()和ppoll()的含义、使用和区别。以简单的例子介绍非阻塞编程的方法。,9.1IO函数,Linux操作系统中的IO函数主要有read()、write()、recv()、send()、recvmsg()、sendmsg()、readv()、writev()。本节对上述的主要函数进行介绍,其中的read()和write()函数在前面已经介绍过。,9.1.1使用recv()接收数据,函数recv()用于接收数据,函数原型如下。函数recv()从套接字s中接收数据放到缓冲区buf中,buf的长度为len,操作的方式由flags指定。第一个参数s是套接口文件描述符,它是由系统调用socket()返回的。第二个参数buf是一个指针,指向接收网络数据的缓冲区。第三个参数len表示接收缓冲区的大小,以字节为单位。#include#includessize_trecv(ints,void*buf,size_tlen,intflags);,9.1.2使用send()发送数据,函数send()用于发送数据,函数原型如下。函数send()将缓冲区buf中大小为len的数据通过套接字文件描述符按照flags指定的方式发送出去。当send函数的返回值小于len的时候,表明缓冲区中仍然有部分数据没有成功发送,这时需要重新发送剩余部分的数据。通常的剩余数据发送方法是对原来的buf中的数据位置进行偏移,偏移的大小为以发送成功的字节数。#include#includessize_tsend(ints,constvoid*buf,size_tlen,intflags);,9.1.2使用send()发送数据,9.1.3使用readv()接收数据,函数readv()可用于接收多个缓冲区数据,函数原型如下。函数readv()从套接字描述符s中读取count块数据放到缓冲区向量vector中#includessize_treadv(ints,conststructiovec*vector,intcount);,9.1.3使用readv()接收数据,9.1.4使用writev()发送数据,函数writev()可用于接收多个缓冲区数据,函数原型如下。函数writev()向套接字描述符s中写入在向量vector中保存的count块数据。#includessize_twritev(intfd,conststructiovec*vector,intcount);,9.1.5使用recvmsg()接收数据,函数recvmsg()用于接收数据,与recv()函数、readv()函数相比较,这个函数的使用要复杂一些。1函数recvmsg()原型含义2地址结构msghdr3函数recvmsg()用户空间与内核空间的交互,9.1.5使用recvmsg()接收数据,9.1.6使用sendmsg()发送数据,函数sendmsg()可用于接收多个缓冲区数据,函数原型如下。函数sendmsg()向套接字描述符s中按照结构msg的设定写入数据,其中操作方式有flags指定。#includessize_tsendmsg(ints,conststructmsghdr*msg,intflags);,9.1.7IO函数的比较,表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()/sendmsg()具有可选标志。函数recvfrom()/sendto()和recvmsg()/sendmsg()可以选择对方的IP地址。函数recvmsg()/sendmsg()有可选择的控制信心,能进行高级操作。,9.1.7IO函数的比较,9.2使用IO函数的例子,小节9.1中对典型的IO函数进行了介绍,本小节中针对上述的函数给出程序设计的例子。包括典型的send()/recv()、writev()/readv()、sendmsg()/recvmsg()三种类型。,9.2.1客户端处理框架例子,客户端处理程序是一个程序框架,为后面的使用三种类型的收发函数建立基本的架构。1客户端程序框架2客户端程序框架代码,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_client(),使用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处理函数4信号SIGPIPE的处理函数,9.3.IO模型,IO的方式有阻塞IO、非阻塞IO模型、IO复用、信号驱动、异步IO等,本节中以UDP为例介绍IO的几种模型。,9.3.1阻塞IO模型,阻塞IO是最通用的IO类型,使用这种模型进行数据接收的时候,在数据没有到之前程序会一直等待。,9.3.2非阻塞IO模型,当把套接字设置成非阻塞的IO,则对每次请求,内核都不会阻塞,会立即返回;当没有数据的时候,会返回一个错误。,9.3.3IO复用,使用IO复用模型可以在等待的时候加入超时的时间,当超时时间没有到达的时候与阻塞的情况一致,而当超时时间到达仍然没有数据接收到,系统会返回,不再等待。select()函数按照一定的超时时间轮询,直到需要等待的套接字有数据到来,利用recvfrom()函数,将数据复制到应用层。,9.3.4信号驱动IO模型,信号驱动的IO在进程开始的时候注册一个信号处理的回调函数,进程继续执行,当信号发生时,即有了IO的时间,这里即有数据到来,利用注册的回调函数将到来的函数用recvfrom()接收到。,9.3.5异步IO模型,异步IO与前面的信号驱动IO相似,其区别在于信号驱动IO当数据到来的时候,使用信号通知注册的信号处理函数,而异步IO则在数据复制完成的时候才发送信号通知注册的信号处理函数。,9.4select()和pselect()函数,函数select()和pselect()用于IO复用,它们监视多个文件描述符的集合,判断是否有符合条件的时间发生。,9.4.1select()函数,函数select()与之前的recv()和send()直接操作文件描述符不同。使用select()函数可以先对需要操作的文件描述符进行查询,查看是否目标文件描述符可以进行读、写或者错误操作,然后当文件描述符满足操作的条件的时候才进行真正的IO操作。1函数select()简介2函数select()的例子,9.4.2pselect()函数,函数select()是用一种超时轮循的方式来查看文件的读写错误可操作性。在Linux下,还有一个相似的函数pselect()。1函数pselect()简介2函数pselect()的例子,9.5poll()函数,除了使用select()进行文件描述符的监视,还有一组函数也可以完成相似的功能,即函数poll()和函数ppoll()。,9.5.1poll()函数,函数poll()等待某个文件描述符上的某个事件的发生。其原型如下:#includeintpoll(structpollfd*fds,nfds_tnfds,inttimeout);函数poll()监视在fds数组指明的一组文件描述符上发生的动作,当满足条件或者超时的时候会退出。参数fds是一个指向结构pollfd数组的指针,监视的文件描述符和条件放在里面。参数nfds,是比监视的最大描述符的值大1的值。参数timeout,是超时时间,单位为毫秒,当为负值时,表示永远等待。,9.5.1poll()函数,9.5.2ppoll()函数,与select()和pselect()的情况相似,与poll()对应的也存在一个ppoll()函数,其定义如下:#includeintppoll(structpollfd*fds,nfds_tnfds,conststructtimespec*timeout,constsigset_t*sigmask);,9.6非阻塞编程,前面介绍的IO程序设计,基本上都是基于阻塞方式的。阻塞方式的读写,在文件没有数据的时候,函数不会返回,而一直等待直到有数据到来。本节介绍文件的非阻塞方式程序设计。,9.6.1非阻塞方式程序设计介绍,非阻塞方式的操作与阻塞方式的操作最大的不同点是函数的调用立刻返回,不管数据是否成功读取或者成功写入。使用fcntl()将套接字文件描述符按照如下的代码进行设置后,可以进行非阻塞的编程:fcntl(s,F_SETFL,O_NONBLOCK);其中的s是套接字文件描述符,使用F_SETFL命令将套接字s设置为非阻塞方式后,再进行读写操作就可以马上返回了。,9.6.2非阻塞程序设计的例子,函数accept()可以使用非阻塞的方式轮询等待客户端的到来,在之前要设置NON_BLOCK方式。下面的代码使用了轮询的方式使用accept()和recv()函数,当客户端发送“HELLO”字符串时,发送“OK”响应给客户端并关闭客户端;当客户端发送“SHUTDOWN”字符串给服务器时,服务器发送“BYE”的客户端,并关闭客户端,然后退出程序。,9.7小结,本章对数据IO进行了介绍。介绍了recv()、send()、readv()、writev()、recvmsg()和sendmsg()等函数的使用,并给出了多个例子。介绍了IO模型:阻塞IO模型、非阻塞IO模型、IO服用、信号驱动IO模型和异步IO模型。select()函数、pselect()函数和poll()函数在查询方式程序设计中经常使用,而fcntl()函数的O_NONBLOCK选项则是进行非阻塞编程中经常使用的设置方法。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!