Linux网络编程概述_第1页
Linux网络编程概述_第2页
Linux网络编程概述_第3页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程名称壬*卜计戈U第9早Linux网络编程概述2学时学时内容分析本早王要介绍网络概述、网络基础知识教学目标与教学要求要求学生了解计算机网络的发展史、掌握网络体系结构OSI参考、TCP/IP模型的使用方法、掌握网络协议、网络端口、IP地址、子网掩码的使用方法、掌握TCP和UDP的使用方法教学重点网络概述、网络基础知识教学难点网络概述、网络基础知识教学方式课堂讲解及ppt演小教学过程第一课时(I/O模型、TCP服务器模型)0内容回顾1. 回顾上节内容,引出本课时主题。本章将介何个独立的模块,一个是I/O模型,另一个是TCP服务器模型。前半部分是对I/O的进一步讨论,前面的章节已经介绍了I/O的各

2、种接口及使用,本章继续深入讨论I/O的几种访问文件的方式,通常称为I/O模型。后半部分是针对TCP编程的进一步讨论,使用TCP编程结合其他技术,实现循环或并发服务器模型。网络编程在实际应用层开发中使用率较高,因此本章在最后结合服务器模型介绍TCP、UDP的经典编程案例。望读者在理解基础概念的前提下,熟练编程操作并加以应用。从而引出本节的内容。2. 明确学习目标(1) 能够掌握阻塞I/O(2) 能够掌握非阻塞I/O(3) 能够掌握I/O多路复用(4) 能够掌握信号驱动I/O(5) 能够掌握循环服务器(6) 能够掌握fork()实现并发服务器(7) 能够掌握select()实现并发服务器1愆知识讲

3、解?阻塞I/O第2章中介绍了文件I/O这种采用系统调用的方式对文件进行读写操作,这其中涉及CPU状态的切换、空间进程的切换以及数据的传递。对于一次I/O访问(如read()函数、write()函数等),数据会先被复制到操作系统内核的存储区域中,然后再从操作系统内核的存储区域中复制到应用程序的地址空间。因此,干-个read()函数操作发生时,通常会经历两个阶段:第一阶段是等待数据准备;第二阶段是将数据从内核空间中复制给进程。综上所述,阻塞I/O就是当用户进程发起一个I/O请求操作(以读取为例),内核将会查看读取的数据是否准备就绪,如果没有准备好,则当前进程被挂起(睡眠),阻塞等待结果返回。例如,

4、下面所述的示例,则是一个典型的阻塞I/O。如果fgets()函数读取终端输入时,没有输入,则printf()函数将不会执行。程序将会在fgets()函数处一直等待,直到有终端输入为止。while(1)(fgets(buf,N,stdin);printf(“*n”);?非阻塞I/O非阻塞I/O与阻塞I/O不同的是,当用户进程执行读操作时,如果内核中的数据没有准备就绪,那么它并不会阻塞用户进程,而是立刻返回一个错误码。从用户进程角度讲,它发起一个读操作后,并不需要等待,而是马上得到一个结果。用户进程判断结果是一个错误码时,它就知道数据还没有准备就绪,于是它可以再次发送读操作。一旦内核中的数据准备好

5、了,并且再次收到用户进程的系统调用请求,则它会立刻将数据复制到用户进程使用的内存。I/O操作函数将不断地测试数据是否已经准备就绪,如果没有准备就绪则继续,直到数据准备就绪为止。整个I/O请求的过程中,虽然用户程序每次发起I/O请求后可以立即返回,但是为了得到数据,仍需要不断地轮询、重复请求,这消耗了大量的CPU的资源。所以,非阻塞I/O的特点是用户进程需要不断的主动询问内核数据是否准备就绪。在数据复制阶段,用户进程还是阻塞的。在套接字编程中,如果设置参数为NONBLOCK(非阻塞,准确为SOCK_NONBLOCK)就是告诉内核,当所请求的I/O操作无法完成时,不i寂帽i寂帽剖玺用白空间要将进程

6、睡眠,而是返回一个错误码(EWOULDBLOCK),这样请求就不会阻塞。造专度St调塌*侍返回也理如图所示,当用户进程执行recvform()系统调用,如果没有准备就绪的数据报,内核则会向用户进程立刻返回错误码。当用户进程访问数据报,且数据报准备就绪时,内核将数据立刻读到用户进程的内存空间中,函数执行返回成功。I/O多路复用I/O多路复用指的是在一个程序中,跟踪处理多条独立的I/O流。所谓I/O流,可以理解为建立一次读或者写的操作,I/O多路复用意在处理多个独立的输入/输出操作,其操作对象为文件描述符。I/O多路复用的出现很好地解决了服务器的吞吐能力。原因就在于,当不使用I/O多路复用时,程序

7、虽然可以处理完所有的I/O流,但是如果某个I/O流被设置为阻塞的,那么很可能会导致其他I/O操作无法执行。例如,在上一节中讨论的示例,当fgets()函数读取终端输入时,没有任何输入,则直接导致printf()函数的输出无法执行。while(1)(fgets(buf,N,stdin);printf(“*n”);信号驱动I/O信号驱动I/O就是指进程预先告知内核、向内核注册一个信号处理函数,然后用户进程返回不阻塞。当内核数据准备就绪时会发送一个信号给进程,用户进程接收到信号后,在信号处理函数中调用I/O操作读取数据。信号驱动I/O涉及Linux内核驱动内容,本次不再详述,读者可以查询Linux驱

8、动I/O模型进行学习。如图所示为信号驱动I/O的设计模型。建立giGio的信号处理程序XflZfasvnchelper、蛆回/遇BSIGIO信号姓理巷序recvfrQHi教提报准备好w剑朽据报戍用.史理肉岐复制完成/返回成N指示将数据从内核SE制剖用户空间循环服务器由于多个客户端的请目前最常用的服务直到当前客户端的在网络通信中,服务器通常需要处理多个客户端。求可能会同时到来,服务器端可采用不同的方式来处理。器模型为循环服务器模型与并发服务器模型。循环服务器模型是指服务器端依次处理每个客户端,所有请求处理完毕,再处理下一个客户端。此类模型的特点是简单,但也容以造成除当前客户端以外的其他客户端等待

9、时间过长的情况。循环服务器的实现其实很简单,通常可以采用循环嵌套的方式来实现。即外层循环依次接收客户端的请求,建立TCP连接。内层循环接收并处理客户端的所有数据。直到客户端关闭连接。如果当前客户端没有处理结束,其他客户端必须一直等待。因此,需要特别注意的是循环服务器不能在同一时刻响应多个客户端的请求。fork实现并发服务器(TCP)为了提高服务器的并发处理能力,在这里又引入了并发服务器的模型。并发服务器解决了循环服务器的缺陷,即可以在同一时刻响应多个客户端的请求。其基本设计思想是在服务器端采用多任务机制(多进程或多线程),分别为每一个客户端创建一个任务处理。也可以使用select()函数实现并

10、发服务器。首先介绍使用父子进程实现并发服务器(多线程与之类似),具体设计细节为:父进程接收客户端的连接请求但不处理具体消息,子进程来处理客户端的消息,也就是说,服务器端父进程一旦接收到客户端的连接请求,便建立好连接并创建新的子进程。这意味着每个客户端在服务器端有一个专门的子进程为其服务。父子进程实现并发服务器流程如图所示。?select实现并发服务器(TCP)上一节中,展示了如何通过多任务的方式(多进程)实现同时处理客户端请求的服务器模型。实现这种服务器的方式还有其他的方法,例如通过多线程的方式。由于创建多线程与创建子进程的处理模式是一样的,唯一不同可能是资源使用问题。因此本节将展示使用9.1

11、.3节中介绍的select()来实现并发服务器。使用select()完成并发服务器,在代码实现的难度上较多任务的方式要复杂一点。但相较于多进程或多线程,I/O多路复用的方式大大地降低了系统的开销。在本次示例中,服务器通过select()监听用于接收请求的sockfd,以及用于收发信息的acceptfd,判断其是否准备就绪,从而选择进行接收请求或是收发数据。随着连接的客户端逐渐增多,其监听集合中的文件描述符也逐渐增多。由于客户端作为一个连接测试功能的示例,可以使用上一节中的客户端示例,因此本次将不展示客户端示例代码。并发服务器服务器端的代码参考教材9.2.3节。第二课时(TCP文件服务器、UDP

12、网络聊天室)k忑内容回顾1. 回顾上节内容,引出本课时主题。上节已经介绍了I/O模型、TCP服务器模型,下面将介绍TCP文件服务器、UDP网络聊天室。2. 明确学习目标(1) 能够掌握功能说明(2) 能够掌握功能实现(云知识讲解?功能说明本节将通过一个示例进一步讨论TCP编程,该示例使用循环服务器的设计思想,实现一个功能类似于数据库的文件服务器,如同所示。该文件服务器支持对文件的保存,实现客户端与服务器交互的三大功能,如图所示。查看服务器目录客下载文件服务_1器端(1) 实现客户端查看服务器的目录的所有文件名。(2) 实现客户端可以下载服务器的目录的文件。(3) 实现客户端能够上传文件到服务器

13、。根据上述模块功能需求的描述,设计文件服务器的代码实现流程,其客户端的流程图如下所示。如图所示。客户端功能选择分支中,“L”表示list,即查看服务器的目录的文件;“G”表示get,即从服务器的目录下载所需文件;“P”表示put,即向服务器上传文件。函数do_list()为自定义函数,用来实现查看功能;函数do_download()同样为自定义函数,用来实现从服务器中下载文件;函数do_upload()同样为自定义函数,用来实现上传文件。服务器端的流程如图所g濒dvoid(tritaewpifd!acctpTfd*eher*fivni4(i*tu-izaptfd,eharafi1:?功能实现服

14、务器端用来响应客户端的请求,其代码示例参考教材9.3.2节。其中,基于TCP协议的套接字编程需要熟练掌握。服务器端核心操作为查看文件函数do_list()函数、下载文件函数do_download()函数、上传文件函数do_upload()函数。查看文件的方式为打开目录进行读取,获取目录中文件的名称,并将文件名称发送给客户端。下载文件的方式则是将客户端需要下载的文件打开,并读取文件中的数据发送给客户端,客户端则将数据写入新文件即可。上传文件是将客户端发送的文件数据写入新的文件。?功能说明上一节中介绍了使用TCP的套接字编程实现文件服务器的案例。本节将继续通过网络聊天室的示例,帮助读者巩固基于UD

15、P的套接字编程。该示例类似于在线通信群聊,主要包括以下几个功能。(1) 如果用户登录,其他在线的用户可以收到该用户的登录信息。(2) 如果用户发送信息,其他在线的用户可以收到该信息。(3) 如果用户退出,其他在线用户可以收到退出信息。(4) 同时,服务器可以发送系统信息。其中客户端、服务器发送信息以及接收信息的情况如图所示,可以看出客户端发送信息,其他客户端并非直接接收到信息,收到的是通过服务器进行了转发。同时,服务器也可以向所有连接的客户端发送系统信息。根据上述功能需求,可以简单设计服务器与客户端的程序流程。其服务器端的程序运行流程如图所示,服务器端通过创建子进程完成发送系统消完,通过父进程完成接收客户端的信息。于进程父进程客户端的流程如图所示,父进程用来接收数据,子进程用来发送数据。?功能实现服务器的代码实现示例参考教材9.4.2节,do_login()函数为客户端登录时服务器执行的操作,将用户信息发送给其他在线用户,用户的存储是通过建立链表实现的,并将新登录的用户存储在链表中。do_chat()函数实现将用户发送的信息转发给其他用户。do_quit()函数用来将用户删除,以此来实现退出。第三课时上机练

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论