梅芳-网络编程-复习-课件

上传人:沈*** 文档编号:241537364 上传时间:2024-07-02 格式:PPT 页数:90 大小:595KB
返回 下载 相关 举报
梅芳-网络编程-复习-课件_第1页
第1页 / 共90页
梅芳-网络编程-复习-课件_第2页
第2页 / 共90页
梅芳-网络编程-复习-课件_第3页
第3页 / 共90页
点击查看更多>>
资源描述
网络编程主讲:王新颖主讲:王新颖wxyaljlu.edu吉林大学软件学院吉林大学软件学院1.1 网络编程相关的基本概念网络编程相关的基本概念1.1.1 网络编程与进程通信网络编程与进程通信1进程与线程的基本概念进程与线程的基本概念进程是处于运行过程中的程序进程是处于运行过程中的程序实例实例,是操作系,是操作系统调度和分配资源的基本单位。统调度和分配资源的基本单位。一个进程实体由程序代码、数据和进程控制块一个进程实体由程序代码、数据和进程控制块三部分构成。三部分构成。各种计算机应用程序在运行时,都以进程的形各种计算机应用程序在运行时,都以进程的形式存在。网络应用程序也不例外。式存在。网络应用程序也不例外。第一页最后一页吉林大学软件学院吉林大学软件学院 Windows系统不但支持多进程,还支持多系统不但支持多进程,还支持多线程。线程。当创建一个进程时,系统会自动创建它的第一当创建一个进程时,系统会自动创建它的第一个线程,称为主线程。然后,该线程可以创建其他个线程,称为主线程。然后,该线程可以创建其他的线程,而这些线程又能创建更多的线程。的线程,而这些线程又能创建更多的线程。Windows 2000能够在拥有多个能够在拥有多个CPU的的计算机上运行,每个计算机上运行,每个CPU上运行不同的线程,达上运行不同的线程,达到多线程运行。到多线程运行。Windows系统系统第一页最后一页吉林大学软件学院吉林大学软件学院2网络应用进程在网络体系结构中的位置网络应用进程在网络体系结构中的位置 从从计计算算机机网网络络体体系系结结构构的的角角度度来来看看,网网络络应应用用进程处于网络层次结构的最上层。进程处于网络层次结构的最上层。从功能上,可以将网络应用程序分为两部分,从功能上,可以将网络应用程序分为两部分,一部分是专门负责网络通信的模块,它们与网络协一部分是专门负责网络通信的模块,它们与网络协议栈相连接,借助网络协议栈提供的服务完成网络议栈相连接,借助网络协议栈提供的服务完成网络上数据信息的交换。另一部分是面向用户或者作其上数据信息的交换。另一部分是面向用户或者作其他处理的模块,它们接收用户的命令,或者对借助他处理的模块,它们接收用户的命令,或者对借助网络传输过来的数据进行加工,这两部分模块相互网络传输过来的数据进行加工,这两部分模块相互配合,来实现网络应用程序的功能。配合,来实现网络应用程序的功能。第一页最后一页吉林大学软件学院吉林大学软件学院 网网络络应应用用程程序序最最终终要要实实现现网网络络资资源源的的共共享享,共共享享的的基基础础就就是是必必须须能能够够通通过过网网络络轻松地传递各种信息。轻松地传递各种信息。网网络络编编程程首首先先要要解解决决网网间间进进程程通通信信的的问问题题。然然后后才才能能在在通通信信的的基基础础上上开开发发各各种种应用功能。应用功能。第一页最后一页吉林大学软件学院吉林大学软件学院3实现网间进程通信必须解决的问题实现网间进程通信必须解决的问题 网网间间进进程程通通信信是是指指网网络络中中不不同同主主机机中中的的应应用用进进程程之之间间的的相相互互通通信信问问题题,网网间间进进程程通通信必须解决以下问题:信必须解决以下问题:(1)网间进程的标识问题)网间进程的标识问题(2)如何与网络协议栈连接的问题)如何与网络协议栈连接的问题(3)多重协议的识别问题)多重协议的识别问题(4)不同的通信服务的问题)不同的通信服务的问题第一页最后一页吉林大学软件学院吉林大学软件学院 按按照照OSI七七层层协协议议的的描描述述,传传输输层层与与网网络络层层在在功功能能上上的的最最大大区区别别是是传传输输层层提提供供进进程程通通信信的的能能力力。TCP/IP协协议议提提出出了了传传输输层层协协议议端端口口(protocol port,简简称称端端口口)的的概概念念,成成功功地地解解决决了了通通信信进进程的标识问题。程的标识问题。传传输输层层是是计计算算机机网网络络中中,通通信信主主机机内内部部进进行行独独立立操操作作的的第第一一层层,是是支支持持端端到到端端的的进进程程通通信信的的关关键键的一层。的一层。第一页最后一页吉林大学软件学院吉林大学软件学院2端口的概念端口的概念端口是端口是TCP/IP协议族中,应用层进程与协议族中,应用层进程与传输层协议实体间的通信接口传输层协议实体间的通信接口 类似于文件描述符,每个端口都拥有一类似于文件描述符,每个端口都拥有一个叫作端口号(个叫作端口号(port number)的整数型)的整数型标识符标识符 第一页最后一页吉林大学软件学院吉林大学软件学院3端口号的分配机制端口号的分配机制 TCP/IP协协议议采采用用了了全全局局分分配配(静静态态分分配配)和和本本地地分分配配(动动态态分分配配)相相结结合合的的分分配配方方法法。对对于于TCP,或或者者UDP,将将它它们们的的全全部部65535个个端端口口号号分为保留端口号和自由端口号两部分。分为保留端口号和自由端口号两部分。保留端口的范围是保留端口的范围是01023,又称为众所周知,又称为众所周知的端口或熟知端口(的端口或熟知端口(well-known port),只占),只占少数,采用全局分配或集中控制的方式,由一个公少数,采用全局分配或集中控制的方式,由一个公认的中央机构根据需要进行统一分配,静态地分配认的中央机构根据需要进行统一分配,静态地分配给因特网上著名的众所周知的服务器进程,并将结给因特网上著名的众所周知的服务器进程,并将结果公布于众。果公布于众。第一页最后一页吉林大学软件学院吉林大学软件学院4进程的网络地址的概念进程的网络地址的概念 在在因因特特网网络络中中,用用一一个个三三元元组组可可以以在在全全局局中中唯唯一地标识一个应用层进程:一地标识一个应用层进程:应应用用层层进进程程地地址址=(传传输输层层协协议议,主主机机的的IP地地址,传输层的端口号)址,传输层的端口号)这样一个三元组,叫做一个半相关(这样一个三元组,叫做一个半相关(half-association),它标识了因特网中,进程间通信),它标识了因特网中,进程间通信的一个端点,也把它称为进程的网络地址。的一个端点,也把它称为进程的网络地址。第一页最后一页吉林大学软件学院吉林大学软件学院5网络中进程通信的标识网络中进程通信的标识 一一个个完完整整的的网网间间通通信信需需要要一一个个五五元元组组在在全全局局中中唯一地来标识:唯一地来标识:(传传输输层层协协议议,本本地地机机IP地地址址,本本地地机机传传输输层层端端口口,远地机远地机IP地址,远地机传输层端口地址,远地机传输层端口)这个五元组称为一个全相关这个五元组称为一个全相关(association)。即两个协议相同的半相关才能)。即两个协议相同的半相关才能组合成一个合适的全相关,或完全指定一对网间通组合成一个合适的全相关,或完全指定一对网间通信的进程。信的进程。第一页最后一页吉林大学软件学院吉林大学软件学院1面向消息的协议与基于流的协议面向消息的协议与基于流的协议(1)面向消息的协议)面向消息的协议 面向消息的协议以消息为单位在网上传面向消息的协议以消息为单位在网上传送数据,在发送端,消息一条一条地发送,送数据,在发送端,消息一条一条地发送,在接收端,也只能一条一条地接收,每一条在接收端,也只能一条一条地接收,每一条消息是独立的,消息之间存在着边界。消息是独立的,消息之间存在着边界。1.1.3 网络协议的特征网络协议的特征第一页最后一页吉林大学软件学院吉林大学软件学院(2)基于流的协议)基于流的协议 基基于于流流的的协协议议不不保保护护消消息息边边界界,将将数数据据当当作作字字节节流流连连续续地地传传输输,不不管管实实际际消消息息边界是否存在。边界是否存在。第一页最后一页吉林大学软件学院吉林大学软件学院2面向连接的服务和无连接的服务面向连接的服务和无连接的服务 一一个个协协议议可可以以提提供供面面向向连连接接的的服服务务,或或者提供无连接的服务。者提供无连接的服务。面面向向连连接接服服务务是是电电话话系系统统服服务务模模式式的的抽抽象象,即即每每一一次次完完整整的的数数据据传传输输都都要要经经过过建建立立连接,使用连接,终止连接的过程。连接,使用连接,终止连接的过程。无连接服务是邮政系统服务的抽象,每无连接服务是邮政系统服务的抽象,每个分组都携带完整的目的地址,各分组在系个分组都携带完整的目的地址,各分组在系统中独立传送。统中独立传送。第一页最后一页吉林大学软件学院吉林大学软件学院3可靠性和次序性可靠性和次序性 可可靠靠性性保保证证了了发发送送端端发发出出的的每每个个字字节节都都能能到到达达既既定定的的接接收收端端,不不出出错错,不不丢丢失失,不不重复,保证数据的完整性,称为保证投递。重复,保证数据的完整性,称为保证投递。次序性是指对数据到达接收端的顺序进次序性是指对数据到达接收端的顺序进行处理。保护次序性的协议保证接收端收到行处理。保护次序性的协议保证接收端收到数据的顺序就是数据的发送顺序,称为按序数据的顺序就是数据的发送顺序,称为按序递交。递交。第一页最后一页吉林大学软件学院吉林大学软件学院1.1.4 高效的用户数据报协议高效的用户数据报协议UDPUDP 传输层的传输层的用户数据报协议(用户数据报协议(User Datagram Protocol,UDP)是一种尽力传送的无连接的是一种尽力传送的无连接的不不保障可靠保障可靠的的传输传输服务,服务,是一种保护消息边界的数据是一种保护消息边界的数据的传输。的传输。第一页最后一页吉林大学软件学院吉林大学软件学院1.1.5可靠的传输控制协议TCP1可靠性是很多应用的基础可靠性是很多应用的基础 2TCP为应用层提供的服务为应用层提供的服务传输控制协议传输控制协议(Transmission Control Protocol,TCP)应用层进程应用层进程提供一个面提供一个面向连接的、向连接的、端到端的、端到端的、完全可靠的(无差完全可靠的(无差错、无丢失、无重复或失序)全双工的流错、无丢失、无重复或失序)全双工的流传输服务。传输服务。第一页最后一页吉林大学软件学院吉林大学软件学院TCP被称作一种端对端(被称作一种端对端(end to end)协议,这)协议,这是因为它提供一个直接从一台计算机上的应用进程是因为它提供一个直接从一台计算机上的应用进程到另一远程计算机上的应用进程的连接。应用进程到另一远程计算机上的应用进程的连接。应用进程能请求能请求TCP构造一个连接,通过这个连接发送和接构造一个连接,通过这个连接发送和接收数据,以及关闭连接。由收数据,以及关闭连接。由TCP提供的连接叫做虚提供的连接叫做虚连接(连接(virtual connection),虚连接是由软件),虚连接是由软件实现的。事实上,底层的因特网系统并不对连接提实现的。事实上,底层的因特网系统并不对连接提供硬件或软件支持,只是两台机器上的供硬件或软件支持,只是两台机器上的TCP软件模软件模块通过交换消息来实现连接的幻象。块通过交换消息来实现连接的幻象。3TCP利用利用IP数据报实现了端对端的传输服务数据报实现了端对端的传输服务第一页最后一页吉林大学软件学院吉林大学软件学院第第2章章 UNIX中的套接字网络编程接口中的套接字网络编程接口lUNIX套接字网络编程接口的产生与发套接字网络编程接口的产生与发展过程展过程l套接字与套接字与UNIX操作系统的关系操作系统的关系l套接字编程的基本概念套接字编程的基本概念l面向连接的套接字编程面向连接的套接字编程l无连接的套接字编程无连接的套接字编程 最后一页吉林大学软件学院吉林大学软件学院 套接字应用程序编程接口是网络应用程序通过套接字应用程序编程接口是网络应用程序通过网络协议栈进行通信时所使用的接口,即应用程序网络协议栈进行通信时所使用的接口,即应用程序与协议栈软件之间的接口,简称套接字编程接口与协议栈软件之间的接口,简称套接字编程接口(Socket API)。它定义了应用程序与协议栈软件进行交互时可它定义了应用程序与协议栈软件进行交互时可以使用的一组操作,决定了应用程序使用协议栈的以使用的一组操作,决定了应用程序使用协议栈的方式、应用程序所能实现的功能、以及开发具有这方式、应用程序所能实现的功能、以及开发具有这些功能的程序的难度。些功能的程序的难度。第一页最后一页吉林大学软件学院吉林大学软件学院2.1 UNIX套接字网络编程接口的产生与发展套接字网络编程接口的产生与发展 加加州州大大学学伯伯克克利利(Berkley)分分校校开开发发并并推推广广了了一一个个包包 括括 TCP/IP互互 联联 协协 议议 的的 UNIX,称称 为为 BSD UNIX(Berkeley Software Distribution UNIX)操操作作系系统统,套套接接字字编编程程接接口口是是这这个个操操作作系系统统的的一一个部分。个部分。后来的许多操作系统并没有另外搞一套其它的编程接后来的许多操作系统并没有另外搞一套其它的编程接口,而是选择了对于套接字编程接口的支持。口,而是选择了对于套接字编程接口的支持。由由于于这这个个套套接接字字规规范范最最早早是是由由Berkeley大大学学开开发发的的,一般将它称为一般将它称为Berkeley Sockets规范。规范。2.1.2 套接字编程接口的起源与应用套接字编程接口的起源与应用第一页最后一页吉林大学软件学院吉林大学软件学院要要想想实实现现套套接接字字编编程程接接口口,可可以以采采用用两两种种实实现现方式,方式,一种是在操作系统的内核中增加相应的软件来一种是在操作系统的内核中增加相应的软件来实现,实现,一种是通过开发操作系统之外的函数库来实现。一种是通过开发操作系统之外的函数库来实现。2.1.3 套接字编程接口的两种实现方式套接字编程接口的两种实现方式第一页最后一页吉林大学软件学院吉林大学软件学院 UNIX操操作作系系统统对对文文件件和和所所有有其其它它的的输输入入/输输出出设设备备采采用用一一种种统统一一的的的的操操作作模模式式,就就是是“打打开开-读读-写写-关关 闭闭”(open-read-write-close)的)的I/O模式。模式。当当TCP/IP协议被集成到协议被集成到UNIX内核中的时候,内核中的时候,相当于在相当于在UNIX系统中引入了一种新型的系统中引入了一种新型的I/O操作,操作,就是应用程序通过网络协议栈来交换数据。就是应用程序通过网络协议栈来交换数据。2.1.4 套接字通信与套接字通信与UNIX操作系统的输入操作系统的输入/输出输出第一页最后一页吉林大学软件学院吉林大学软件学院 在在UNIX系系统统的的实实现现中中,套套接接字字是是完完全全与与其其他他I/O集集成成在在一一起起的的。操操作作系系统统和和应应用用程程序序都都将将套接字编程接口也看作一种输入套接字编程接口也看作一种输入/输出机制。输出机制。但但是是,用用户户进进程程与与网网络络协协议议的的交交互互作作用用实实际际要要比比用用户户进进程程与与传传统统的的I/O设设备备相相互互作作用用要要复复杂杂得多。得多。第一页最后一页吉林大学软件学院吉林大学软件学院2.2 套接字编程的基本概念套接字编程的基本概念 套接字是对网络中不同主机上应用进程之间进行双向通套接字是对网络中不同主机上应用进程之间进行双向通信的端点的抽象,一个套接字就是网络上进程通信的一端,信的端点的抽象,一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议栈交换数据的机制提供了应用层进程利用网络协议栈交换数据的机制。图2.1 电插座与电话插座的作用2.2.1 什么是套接字(什么是套接字(SOCKET)第一页最后一页吉林大学软件学院吉林大学软件学院l 我们应当从多个层面来理解套接字这我们应当从多个层面来理解套接字这个概念的内涵。个概念的内涵。l 从套接字所处的地位来讲,套接字上从套接字所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程联应用进程,下联网络协议栈,是应用程序通过网络协议栈进行通信的接口,是应序通过网络协议栈进行通信的接口,是应用程序与网络协议栈进行交互的接口。用程序与网络协议栈进行交互的接口。第一页最后一页吉林大学软件学院吉林大学软件学院 从从实实现现的的角角度度来来讲讲,非非常常复复杂杂。套套接接字字是是一一个个复复杂杂的的软软件件机机构构,包包含含了了一一定定的的数数据据结结构构,包包含含许许多选项,由操作系统内核管理。多选项,由操作系统内核管理。从从使使用用的的角角度度来来讲讲,非非常常简简单单。对对于于套套接接字字的的操作形成了一种网络应用程序的编程接口(操作形成了一种网络应用程序的编程接口(API)。)。本本书书把把这这一一套套操操作作套套接接字字的的编编程程接接口口函函数数称称作作套接字编程接口,套接字是它的操作对象。套接字编程接口,套接字是它的操作对象。总之,套接字是网络通信的基石。总之,套接字是网络通信的基石。第一页最后一页吉林大学软件学院吉林大学软件学院1通信域通信域 接接字字存存在在于于通通信信域域中中,通通信信域域是是为为了了处处理理一一般般的的进进程程通通过过套套接接字字通通信信而而引引入入的的一一种种抽抽象象概概念念,套接字通常只和同一域中的套接字交换数据。套接字通常只和同一域中的套接字交换数据。如如果果数数据据交交换换要要穿穿越越域域的的边边界界,就就一一定定要要执执行某种解释程序。行某种解释程序。现现在在,仅仅仅仅针针对对Internet域域,并并且且使使用用Internet协议族(即协议族(即TCP/IP协议族)来通信。协议族)来通信。2.2.2 套接字的特点套接字的特点第一页最后一页吉林大学软件学院吉林大学软件学院2套接字具有三种类型套接字具有三种类型 每每一一个个正正被被使使用用的的套套接接字字都都有有它它确确定定的的类类型型,只有相同类型的套接字才能相互通信。只有相同类型的套接字才能相互通信。(1)数据报套接字()数据报套接字(Datagram SOCKET)数数据据报报套套接接字字提提供供无无连连接接的的不不保保证证可可靠靠的的独独立立的的数数据据报报传传输输服服务务。在在Internet通通信信域域中中,数数据据报报套套接接字字使使用用UDP数数据据报报协协议议形形成成的的进进程程间间通通路路,具有具有UDP协议为上层所提供的服务的所有特点。协议为上层所提供的服务的所有特点。第一页最后一页吉林大学软件学院吉林大学软件学院(2)流式套接字()流式套接字(Stream SOCKET)流流式式套套接接字字提提供供双双向向的的、有有序序的的、无无重重复复的的、无无记记录录边边界界的的可可靠靠的的数数据据流流传传输输服服务务。在在Internet通通信信域域中中,流流式式套套接接字字使使用用TCP协协议议形形成成的的进进程程间间通通路路,具具有有TCP协协议议为为上上层层所所提提供供的的服服务务的的所所有有特特点点,在在使使用用流流式式套套接接字字传传输输数数据据之之前前,必必须须在在数数据据的的发发送送端端和和接接收收端端之之间间建建立立连连接。接。第一页最后一页吉林大学软件学院吉林大学软件学院(3)原始式套接字()原始式套接字(RAW SOCKET)原始式套接字允许对较低层次的协议,如原始式套接字允许对较低层次的协议,如IP、ICMP直接访问,用于检验新的协议的实现。直接访问,用于检验新的协议的实现。第一页最后一页吉林大学软件学院吉林大学软件学院3套接字的创建套接字的创建套套接接字字由由应应用用层层的的通通信信进进程程创创建建,并并为为其服务其服务就就是是说说,每每一一个个套套接接字字都都有有一一个个相相关关的的应应用用进进程程,操操作作该该套套接接字字的的代代码码是是该该进进程程的的组成部分。组成部分。第一页最后一页吉林大学软件学院吉林大学软件学院4使用确定的使用确定的IP地址和传输层端口号地址和传输层端口号 往往在生成套接字的描述符后,要将套往往在生成套接字的描述符后,要将套接字与计算机上的特定的接字与计算机上的特定的IP地址和传输层地址和传输层端口号相关联,这个过程称为绑定。端口号相关联,这个过程称为绑定。一个套接口要使用一个确定的三元组网络一个套接口要使用一个确定的三元组网络地址信息,才能使它在网络中唯一地被标地址信息,才能使它在网络中唯一地被标识。识。第一页最后一页吉林大学软件学院吉林大学软件学院(1)不不管管是是采采用用对对等等模模式式或或者者客客户户机机/服服务务器器模模式,通信双方的应用程序都需要开发。式,通信双方的应用程序都需要开发。(2)双方所交换数据的结构和交换数据的顺序有)双方所交换数据的结构和交换数据的顺序有特定的要求,不符合现在成熟的应用层协议,甚至特定的要求,不符合现在成熟的应用层协议,甚至需要自己去开发应用层协议,自己设计最适合的数需要自己去开发应用层协议,自己设计最适合的数据结构和信息交换规程。据结构和信息交换规程。2.2.3 套接字的应用场合套接字的应用场合第一页最后一页吉林大学软件学院吉林大学软件学院本机字节顺序和网络字节顺序本机字节顺序和网络字节顺序 在在具具体体计计算算机机中中的的多多字字节节数数据据的的存存储储顺顺序,称为本机字节顺序。序,称为本机字节顺序。多多字字节节数数据据在在网网络络协协议议报报头头中中的的存存储储顺顺序,称为网络字节顺序。序,称为网络字节顺序。第一页最后一页吉林大学软件学院吉林大学软件学院 网络应用程序要在不同的计算机中运网络应用程序要在不同的计算机中运行,本机字节顺序是不同的,但是,网络行,本机字节顺序是不同的,但是,网络字节顺序是一定的。字节顺序是一定的。所以,应用程序在编程的时候,在把所以,应用程序在编程的时候,在把IP地址和端口号装入套接字的时候,应当地址和端口号装入套接字的时候,应当把它们从本机字节顺序转换为网络字节顺把它们从本机字节顺序转换为网络字节顺序;相反,在本机输出时,应将它们从网序;相反,在本机输出时,应将它们从网络字节顺序转换为本机字节顺序。络字节顺序转换为本机字节顺序。第一页最后一页吉林大学软件学院吉林大学软件学院 通通常常,我我们们使使用用域域名名来来标标识识站站点点,可可以以将将文文字字型的主机域名直接转换成型的主机域名直接转换成IP地址,地址,struct hostent*gethodtbyname(const char*name);入口参数:是站点的主机域名字符串,入口参数:是站点的主机域名字符串,返回值:返回值:是指向是指向hostent 结构的指针,结构的指针,hostent结构包含主机名,主机别名数组,返回地结构包含主机名,主机别名数组,返回地址的类型(一般是址的类型(一般是AF-INET),地址长度的字节),地址长度的字节数,已符合网络字节顺序的主机网络地址等。数,已符合网络字节顺序的主机网络地址等。域名服务域名服务第一页最后一页吉林大学软件学院吉林大学软件学院2.3 面向连接的套接字编程面向连接的套接字编程第一页最后一页吉林大学软件学院吉林大学软件学院1创建套接字创建套接字SOCKET()SOCKET过过程程创创建建一一个个套套接接字字并并返返回回一一个个整整型型描描述符:述符:int SOCKET(int Protofamily,int Type,int Protocol);第一页最后一页吉林大学软件学院吉林大学软件学院2.3 面向连接的套接字编程面向连接的套接字编程2绑定套接字到指定的地址绑定套接字到指定的地址 BIND()lintBIND(intSockfd,structsockaddr*My_addr,intAddrlen);3启动监听启动监听Listen()lintLISTEN(intSockfd,intQueuesize);4接收连接请求接收连接请求ACCEPT()lintACCEPT(intSockfd,structsockaddr*Addr,int*addrlen);第一页最后一页吉林大学软件学院吉林大学软件学院5请求建立连接请求建立连接CONNECT()int CONNECT(int Sockfd,struct sockaddr*Service_addr,int Addrlen);举例:举例:if(CONNECT(sockfd,(struct sockaddr*)(&serv_addr),sizeof(struct sockaddr)0)报错,并退出 第一页最后一页吉林大学软件学院吉林大学软件学院6读读/写套接字写套接字READ()和和WRITE()int READ(int sockfd,void*buffer,int len)int WRITE(int sockfd,void*buffer,int len)7发送发送 SEND()和接收和接收 RECV()int SEND(int sockfd,char*buf,int len,int flags);int RECV(int sockfd,char*buf,int len,int flags);8关闭套接字关闭套接字CLOSE()int CLOSE(int sockfd);第一页最后一页吉林大学软件学院吉林大学软件学院2.3.4进程的阻塞问题和对策1什么是阻塞什么是阻塞 阻塞是指一个进程执行了一个函数或者阻塞是指一个进程执行了一个函数或者系统调用,该函数由于某种原因不能立即系统调用,该函数由于某种原因不能立即完成,因而不能返回调用它的进程,导致完成,因而不能返回调用它的进程,导致进程受控于这个函数而处于等待的状态,进程受控于这个函数而处于等待的状态,进程的这种状态称为阻塞。进程的这种状态称为阻塞。第一页最后一页吉林大学软件学院吉林大学软件学院2能引起阻塞的套接字调用能引起阻塞的套接字调用 在Berkeley套接字网络编程接口的模型中,套接字的默认行为是阻塞的,具体地说,在一定情况下,有多个操作套接字的系统调用会引起进程阻塞。(1)ACCEPT()(2)READ()、RECV()和READFORM()(3)WRITE()、SEND()和SENDTO()(4)CONNECT()(5)SELECT()(6)CLOSESOCKET()第一页最后一页吉林大学软件学院吉林大学软件学院2.4 无连接的套接字编程无连接的套接字编程2.4.1 无连接的套接字编程的两种模式无连接的套接字编程的两种模式 使使用用数数据据报报套套接接字字开开发发网网络络应应用用程程序序,既既可可以以采采用用客客户户/服服务务器器模模式式,也也可可以以采采用用对等模式。对等模式。第一页最后一页吉林大学软件学院吉林大学软件学院2.4.2 两个专用的系统两个专用的系统调用调用1发送数据报发送数据报SENDTO()int SENDTO(int sockfd,const void*msg,int len,unsigned int flags,struct sockaddr*to,int tolen);2接收数据报接收数据报 RECVFROM()int RECVFROM(int sockfd,void*buf,int len,unsigned int flags,struct sockaddr*from,int*fromlen)第一页最后一页吉林大学软件学院吉林大学软件学院第第3章章 Windows环境的网络编程环境的网络编程内容提要:内容提要:Windows Sockets 规范规范 WinSock 规范与规范与Berkeley套接口的区别套接口的区别 Winsock 1.1 的库函数的库函数3.1 Windows Sockets规范规范3.1.1 概述概述Microsoft公司以公司以Berkeley Sockets规范为规范为范例,定义了范例,定义了Windows Socktes规范,简称规范,简称Winsock规范。这是规范。这是Windows操作系统环境下的套操作系统环境下的套接字网络应用程序编程接口(接字网络应用程序编程接口(API)。)。3.1.2 Windows Sockets规范规范 Windows Sockets 规范是一套开放的、支持多种协议的Windows下的网络编程接口。从1991年到2019年,从1.0版发展到2.0.8版,已成为Windows网络编程的事实上的标准。1Windows Sockets 1.1版本版本 在Winsock.h包含文件中,定义了所有WinSock 1.1版本库函数的语法、相关的符号常量和数据结构。库函数的实现在WINSOCK.DLL动态链接库文件中。(1)WinSock 1.1 全全面面继继承承了了Berkeley Sockets规规范范(2)数据库函数数据库函数Winsock规范定义了数据库查询例程,其中六个采用getXbyY()的形式,大多要借助网络上的数据库来获得信息,(3)WinSock 1.1扩充了扩充了Berkeley Sockets规范规范针对微软 Windows的特点,WinSock 1.1定义了一批新的库函数,提供了对于消息驱动机制的支持,有效地利用Windows多任务多线程的机制。(4)WinSock 1.1只支持只支持TCP/IP协议栈协议栈2WinSock 2.0WinSock 2.0在源码和二进制代码方面与WinSock 1.1兼容,WinSock 2.0增强了许多功能。(1)支持多种协议(2)引入了重叠I/O的概念(3)使用事件对象异步通知(4)服务的质量(QOS)(5)套接口组(6)扩展的字节顺序转换例程(7)分散/聚集方式I/O(8)新增了许多函数。3WinSock 1.1中的阻塞问题中的阻塞问题 阻塞是在把应用程序从Berkeley套接口环境中移植到Windows环境中的一个主要焦点。阻塞是指唤起一个函数,该函数直到相关操作完成时才返回。在Berkeley套接口模型中,一个套接口的操作的缺省行为是阻塞方式的,除非程序员显式地请求该操作为非阻塞方式。在Windows环境下,我们强烈推荐程序员在尽可能的情况下使用非阻塞方式(异步方式)的操作。因为非阻塞方式的操作能够更好地在非占先的Windows环境下工作。3.1.3 WinSock规范与规范与Berkeley套接口的区别套接口的区别1套接口数据类型和该类型的错误返回值套接口数据类型和该类型的错误返回值 在UNIX中,包括套接口句柄在内的所有句柄,都是非负的短整数,在WinSock规范中定义了一个新的数据类型,称作SOCKET,用来代表套接字描述符。typedef u_int SOCKET;SOCKET可以取从0到INVALID_SOCKET-1之间的任意值。2select()函数和函数和FD_*宏宏 在Winsock中,使用select()函数时,应用程序应坚持用FD_XXX宏来设置,初始化,清除和检查fd_set结构。3错误代码的获得错误代码的获得 在UNIX 套接字规范中,如果函数执行时发生了错误,会把错误代码放到errno或h_errno变量中。在Winsock中,错误代码可以使用WSAGetLastError()调用得到。4指针指针 所有应用程序与Windows Sockets使用的指针都必须是FAR指针。5重命名的函数重命名的函数(1)close()改变为closesocket()(2)ioctl()改变为ioctlsocket()6Winsock支持的最大套接口数目支持的最大套接口数目 在 WINSOCK.H中 缺 省 值 是 64,在 编 译 时 由 常 量FD_SETSIZE决定。7头文件头文件 Berkeley头文件被包含在WINSOCK.H中。一个Windows Sockets应用程序只需简单地包含WINSOCK.H就足够了。8Winsock规范对于消息驱动机制的支持规范对于消息驱动机制的支持 体现在异步选择机制、异步请求函数、阻塞处理方法、错误处理、启动和终止等方面。第第6章章WinSock的多线程编程的多线程编程WinSock需要多线程编程的原因,Win32操作系统下的多进程多线程机制、多线程机制在网络编程中的应用和VisualC+6.0对多线程网络编程的支持。进而分析了MFC支持的两种线程,给出了创建MFC的工作线程、创建并启动用户界面线程和终止线程的步骤。6.1 WinSock为什么需要多线程编程为什么需要多线程编程6.1.1 WinSock的两种输入输出模式的两种输入输出模式如前所述,WinSock在进行输入输出的时候,可以使用两种工作模式。即“阻塞”模式(Blocking Mode)或“非阻塞”模式,又称为同步模式或异步模式。工作在“阻塞”模式的套接字称为阻塞套接字,工作在“非阻塞”模式下的套接字称为非阻塞套接字。6.1.2 两种模式的优缺点及解决方法两种模式的优缺点及解决方法“阻塞”与“非阻塞”模式各有其优点和缺点。阻塞套接字的I/O操作工作情况比较确定,无非是调用、等待、返回。大部分情况下,I/O操作都能成功地完成,不过就是花费了等待的时间。因而比较容易使用,容易编程;但在应付诸如需要建立多个套接字连接来为多个客户服务的时候,或在数据的收发量不均匀的时候,或在输入输出的时间不确定的时候,却显得性能低下,甚至无能为力。使用非阻塞套接字,需要编写更多的代码,因为必须恰当地把握调用I/O函数的时机,尽量减少无功而返的调用,还必须详加分析每个Winsock调用中收到的WSAEWOULDBLOCK错误,采取相应的对策,这种I/O操作的随机性使得非阻塞套接字显得难于操作。所以,我们必须采取一些适当的对策,克服这两种模式的缺点,让阻塞和非阻塞套接字能够满足各种场合的要求。对于非阻塞的套接字工作模式,进一步引入了五种“套接字I/O模型”,在第8章详细说明。对于阻塞的套接字工作模式,则进一步引入了多线程机制。6.2 Win32操作系统下的多进程多线程机制操作系统下的多进程多线程机制6.2.1 Win32是单用户多任务的操作系统是单用户多任务的操作系统最早的DOS是单用户单任务的。后来发展到图形界面的Windows,发展到Windows 95,Windows 98,就都支持多任务了,从Windows NT起,Windows操作系统更是发展成了一个真正的抢占式多任务操作系统。6.2.2 Win32 OS是支持多线程的操作系统是支持多线程的操作系统 Win32操作系统还支持同一进程的多线程。在一个Windows进程内,可以包含多个线程。一个线程(thread)是进程内的一条执行路径,具体地说,是一个应用程序中的一条可执行路径,往往是应用程序中的一个或多个函数。一个进程中至少要有一个线程,习惯将它称为主线程。任何一个应用程序进程都有一个主线程。一般C程序中的Main或WinMain函数就规定了主线程的执行代码。当你启动了一个应用程序时,操作系统在为它创建了进程之后,也创建了该进程的主线程,并根据Main或WinMain函数的地址,开始执行该进程的主线程。主线程可以创建并启动其他辅助线程,由主线程创建的线程又可以创建并启动更多的线程。一个线程也需要占用一定的系统资源,线程是进程中相对独立的执行单位,也是Win32操作系统中可调度的最小的执行单位。多个进程中的多个线程并发地执行。对于拥有多个处理机的计算机系统,调度程序可以将不同的线程安排到不同的处理机上去运行,一方面平衡了CPU的负载,另一方面也提高了系统的运行效率。当某个线程的代码都执行完毕时,该线程会自动终止;当一个线程终止时,会将它所占用的资源释放给进程。6.2.3 多线程机制在网络编程中的应用多线程机制在网络编程中的应用如果一个应用程序,有多个任务需要同时进行处理,那就最适合使用多线程机制。对于网络上客户机软件,采用多线程的编程技术,能克服在单线程的编程模式下,由于阻塞等待而产生的客户程序就不能及时响应用户的操作命令的问题。对于网络上服务器软件,采用多线程的编程技术,能更好地为多个客户服务。即便是对于一个客户,采用多线程机制也能大大提高应用程序的运行效率。比如大家熟悉的东方快车、网络蚂蚁等文件下载软件,就采用了多线程机制,用多个线程同时下载一个文件的不同部分,大大加快了下载速度。总之,多线程机制在网络编程中是大有作为的。6.3 Visual C+6.0对多线程网络编程的对多线程网络编程的支持支持 Visual C+6.0为程序员提供了Windows应用程序的集成开发环境,在这个环境下,有两种开发程序的方法。既可以直接使用Win32 API来编写C风格的Win32应用程序,也可以利用MFC基础类库编写C+风格的应用程序。在这两种Windows应用程序的开发方式下,多线程的编程原理是一致的。6.3.1 MFC支持的两种线程支持的两种线程 微软的基础类库MFC提供了对于多线程应用程序的支持。在MFC中,线程分为两种,一种是用户接口线程(user-interface thread),或称用户界面线程;另一种是工作线程(the worker thread),这两类线程可以满足不同任务的处理需求。1用户接口线程用户接口线程 用户接口线程通常用来处理用户输入产生的消息和事件,并独立地响应正在应用程序其它部分执行的线程们产生的消息和事件,MFC特别地为用户接口线程提供了一个消息泵(a message pump)。用户接口线程包含一个消息处理的循环,以应对各种事件。在MFC应用程序中,所有的线程都是由CWinThread对象来表示的。CWinThread类(可以理解为C+的Windows 线程类)是用户接口线程的基类,CWinApp就是从CWinThread类派生出来的,我们在编写用户接口线程的时候,也需要从CWinThread类派生出自己的线程类,借助ClassWizard可以很容易地做这项工作。2工作线程工作线程 工作线程(the worker thread),适用于处理那些不要求用户输入并且比较消耗时间的其他任务。对用户来说,工作线程运行在后台。这就使得工作线程特别适合去等待一个事件的发生。CWinThread类同样是工作线程的基类,同样是由CWinThread对象来表示的。但在编写工作线程的时候,你甚至不必刻意地从CWinThread类派生出自己的线程类对象。你可以调用MFC框架的AfxBeginThread帮助函数,它会为你创建CWinThread对象。第第7章章Winsock的输入的输入/输出模型输出模型 第6章已经提到,WinSock在进行输入输出的时候,可以采用阻塞模式或非阻塞模式。使用非阻塞套接字,带有I/O操作的随机性,使非阻塞套接字难于操作,给编程带来困难。为解决这个问题,对于非阻塞的套接字工作模式,进一步引入了五种“套接字I/O模型”,它们有助于应用程序通过一种异步方式,同时对一个或多个套接字上进行的通信加以管理。这些模型包括:select(选择)WSAAsyncSelect(异步选择)WSAEventSelect(事件选择)Overlapped I/O(重叠式I/O)Completion port(完成端口)不同的Windows平台支持不同的I/O模型。如表7.1所示:表7.1操作系统对套接字I/O模型的支持情况平台选择异步选择事件选择重叠式I/O完成端口WindowsCE支持不支持不支持不支持不支持Windows95(WinSock1)支持支持不支持不支持不支持Windows95(WinSock2)支持支持支持支持不支持Windows98支持支持支持支持不支持WindowsNT支持支持支持支持支持Windows2000支持支持支持支持支持7.1 select模型模型 select(选择)模型是Winsock中最常见的I/O模型。它的中心思想是利用select函数,实现对多个套接字I/O的管理。利用select函数,可以判断套接字上是否存在数据,或者能否向一个套接字写入数据。只有在条件满足时,才对套接字进行输入输出操作,从而避免无功而返的I/O函数调用,避免频繁产生WSAEWOULDBLOCK错误,使输入输出变得有序。1select的函数的函数select的函数原型如下,其中fd_set数据类型,代表着一系列特定套接字的集合。int select(int nfds,fd_set FAR*readfds,fd_set FAR*writefds,fd_set FAR*exceptfds,const struct timeval FAR*timeout);2操作套接字集合的宏操作套接字集合的宏在应用程序中,用select对套接字进行监视之前,必须先将要检查的套接字句柄分配给某个集合,设置好相应的fd_set结构,再来调用select函数,便可知道一个套接字上是否正在发生上述的I/O活动。Winsock提供了4个宏操作,专门对fd_set数据类型进行操作(1)FD_CLR(s,*set):从set中删除套接字s。(2)FD_ISSET(s,*set):检查s是否set集合的一名成员;如果是,则返回TRUE。(3)FD_SET(s,*set):将套接字s加入集合set。(4)FD_ZERO(*set):将set初始化成空集合。其中,参数s是一个要检查的套接字,参数set是一个fd_set集合类型的指针。例如,调用select函数前,可使用FD_SET宏,将指定的套接字加入到fd_read集合中,select函数完成后,可使用FD_ISSET宏,来检查该套接字是否仍在fd_read集合中。3select模型的操作步骤模型的操作步骤用select操作一个或多个套接字句柄,一般采用下述步骤:(1)使用FD_ZERO宏,初始化自己感兴趣的每一个fd_set集合。(2)使用FD_SET宏,将要检查的套接字句柄添加到自己感兴趣的每个fd_set集合中,相当在指定的fd_set集合中,设置好要检查的I/O活动。(3)调用select函数,然后等待。select完成返回后,会修改每个fd_set结构,删除那些不存在待决I/O操作的套接字句柄,在各个fd_set集合中返回符合条件的套接字。(4)根据select的返回值,使用FD_ISSET宏,对每个fd_set集合进行检查,判断一个特定的套接字是否仍在集合中,便可判断出哪些套接字存在尚未完成(待决)的I/O操作。(5)知道了每个集合中“待决”的I/O操作之后,对相应的套接字的I/O进行处理,然后返回步骤1,继续进行select处理。7.2 WSAAsyncSelect异步异步I/O模型模型异步I/O模型通过调用WSAAsyncSelect()函数实现。利用这个模型,应用程序可在一个套接字上,接收以Windows消息为基础的网络事件通知。该模型最早出现于Winsock的1.1中,以适应其多任务消息环境。1WSAAsyncSelect函数函数函数的定义是:int WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);2窗口回调例程窗口回调例程 应用程序在一个套接字上调用WSAAsyncSelect函数时,该函数的hWnd参数指定了一个窗口句柄。函数成功调用后,当指定的网络事件发生时,会自动执行该窗口对应的窗口回调例程。并将网络事件通知和Windows消息的相关信息,传递给该例程的入口参数,用户可以在该例程中添加自己的代码,针对不同的网络事件进行处理,从而实现有序的套接字输入和输出。窗口回调例程应定义成如下形式:LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);7.3 WSAEventSelect事件选择模型事件选择模型 WSAEventSelect事件选择模型和WSAAsyncSelect模型类似,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知。表7.2总结的、由WSAAsyncSelect模型采用的网络事件,均可原封不动地移植到事件选择模型中。也就是说,在用新模型开发的应用程序中,也能接收和处理所有那些事件。该模型最主要的差别在于,网络事件会投递至一个事件对象句柄,而非投递至一个窗口例程。1创建事件对象句柄创建事件对象句柄事件选择模型要求应用程序针对每一个套接字,首先创建一个事件对象。创建方法是调用WSACreateEvent函数,它的定义如下:WSAEVENT WSACreateEvent(void);函数的返回值很简单,就是一个创建好的事件对象句柄。2关联套接字和事件对象,注册关心的网络事件关联套接字和事件对象,注册关心的网络事件有了事件对象句柄后,接下来必须将其与某个套接字关联在一起,同时注册感兴趣的网络事件类型(表7.2),这就需要调用WSAEventSelect函数,函数的定义为:int WSAEventSelect(SOCKET s,WSAEVENT hEventObject,long lNetworkEvents);调用:WSAAsyncSelect(s,hwnd,WM_SOCKET,FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);表7.2用于WSAAsyncSelect函数的网络事件类型事件类型含义FD_READ应用程序想要接收有关是否有数据可读通知,以便读入数据FD_WRITE应用程序想要接收有关是否有可写通知,以便发送数据FD_OOB应用程序想要接收是否有OOB数据抵达的通知FD_ACCEPT应用程序想要接收与进入的连接请求有关的通知FD_CONNECT 应用程序想要接收一次连接请求操作已经完成的通知FD_CLOSE应用程序想要接收与套接字关闭有关的通知3.等待网络事件触发事件对象句柄的工作状态等待网络事件触发事件对象句柄的工作状态将一个套接字同一个事件对象句柄关联在一起以后,应用程序便可以调用WSAWaitForMultipleEvents函数,等待网络事件触发事件对象句柄的工作状态。该函数用来等待一个或多个事件对象句柄,当其中一个或所有句柄进入“已传信”状态后,或在超过了一个规定的时间期限后,立即返回。该函数的定义:DWORD WSAWaitForMultipleEvents(DWORD cEvents,const WSAEVENT FAR*lphEvents,BOOL fWaitAll,DWORD dwTimeout,BOOL fAlertable);4检查套接字上所发生的网络事件类型检查套接字上所发生的网络事件类型知道了造成网络事件的套接字后,接下来可调用WSAEnumNetworkEvents函数,检查套接字上发生了什么类型的网络事件。该函数定义如下:int WSAEnumNetworkEvents(SOCKET s,WSAEVENT hEventObject,LPWSANETWORKEVENTS lpNetworkEvents);5处理网络事件处理网络事件在确定了套接字上发生的网络事件类型后,可以根据不同的情况做出相应的处理。完成了对WSANETWORKEVENTS结构中的事件的处理之后,应用程序应在所有可用的套接字上,继续等待更多的网络事件。应用程序完成了对一个事件对象的处理后,便应调用WSACloseEvent函数,释放由事件句柄使用的系统资源。函数的定义如下:BOOL WSACloseEvent(WSAEVENT hEvent);该函数也将一个事件句柄作为自己唯一的参数,并会在成功后返回TRUE,失败后返回FALSE。7.4 其他模型其他模型 在Winsock中,重叠I/O(Overlapped I/O)模型能使应用程序达到更佳的性能。重叠模型的基本原理是让应用程序使用一个重叠的数据结构,一次投递一个或多个Winsock的I/O请求。针对那些提交的请求,在它们完成之后,应用程序可为它们提供服务。自Winsock 2.0发布开始,重叠I/O便已集成到新的Winsock函数中,比如WSASend和WSARecv等。因此,重叠I/O模型适用于安装了Winsock 2.0的所有Windows平台。“完成端口”模型是迄今为止最为复杂的一种I
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


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

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


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