轻松学Visual C++之网络编程

上传人:dja****22 文档编号:243460616 上传时间:2024-09-23 格式:PPTX 页数:65 大小:956.20KB
返回 下载 相关 举报
轻松学Visual C++之网络编程_第1页
第1页 / 共65页
轻松学Visual C++之网络编程_第2页
第2页 / 共65页
轻松学Visual C++之网络编程_第3页
第3页 / 共65页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,2012/11/30,#,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,15,章 网络编程,随着,Internet,的普及,人们的生活已经越来越离不开网络。所以,编写网络程序成了每个开发人员必不可少的一项基本技能。,VC+,为编写网络程序提供了多种支持,使我们能更快更方便的的开发出满足需要网络应用程序。通过本章学习,读者也可以编写出即时的聊天程序。,1,15.1,网络编程基础,在使用,VC+,实现网络编程之前,我们有必要学习一下计算机网络的概念、一些常见的术语、还有计算机网络的协议等网络编程的基础知识。,2,15.1.1,计算机网络,计算机网络,即相互连接的独立自主的计算机集合,最简单的网络形式可以只由两台计算机组成,如下图所示。,3,15.1.1,计算机网络,在,Internet,上,为了保证两台主机进行正常的通信,它们需要遵循约定的规则。我们把这种规则称之为协议。如果,A,主机和,B,主机采用同样的协议,它们之间就可以进行通信了。但是主机之间的通信往往不是单一的,一台计算机上可能有多个程序要完成网络的通信。例如,我们一边挂着,QQ,,一边还要看电影,一边还在用迅雷下载东西。那么当信息发送到某个,IP,地址的主机时,应该哪个程序来接收呢?,4,15.1.1,计算机网络,为了标识计算机上运行的每个网络应用程序,我们提出了端口的概念;每个网络应用程序都被分配了一个端口号。在发送数据时,除了指定接收数据主机的,IP,地址外,还要指定端口号。这样,在指定,IP,地址的计算机上,将会由与指定端口号相对应的网络应用程序来接收数据。就好像我们打电话,,IP,地址就像是一个公司的总机号码,端口号就相当于分机号码。在打电话时,拨通总机后,还需要转到分机上,才能找到需要与你通话的人。,5,15.1.2,网络协议,网络协议是网络上所有设备之间通信规则、标准和约定的集合。不同的计算机之间必须使用相同的网络协议才能进行通信。,TCP/IP,协议是目前在网络中应用得最广泛的协议。,TCP/IP,是一个关于,Internet,的标准,并随着的,Internet,广泛应用而被大众所知,它也成为局域网所使用首选的协议。,TCP/IP,是一种分层协议,它共被分为个,4,层次。通过使用该协议,可以高效和可靠地实现各地的计算机相互连接。,TCP/IP,协议中的核心协议有,TCP,(传输控制协议)、,UDP,(用户数据报协议)和,IP,(因特网协议)。,6,15.1.2,网络协议,1,TCP,协议,TCP(Transmission Control Protocol/Internet Protocol,,传输控制协议,),提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用,TCP,的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个,TCP,连接。,该协议主要用于在主机间建立一个虚拟连接,以实现高可靠性的数据包交换。,IP,协议可以进行,IP,数据包的分割和组装,但是通过,IP,协议并不能清楚地了解到数据包是否顺利地发送给目标计算机。而使用,TCP,协议就不同了,在该协议传输模式中在将数据包成功发送给目标计算机后,,TCP,会要求发送一个确认;如果在某个时限内没有收到确认,那么,TCP,将重新发送数据包。另外,在传输的过程中,如果接收到无序、丢失以及被破坏的数据包,,TCP,还可以负责恢复。,7,15.1.2,网络协议,2,UDP,协议,UDP,协议(,User Datagram Protocol,,用户数据报协议)是,OSI,参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。,UDP,协议基本上是,IP,协议与上层协议的接口。,UDP,协议适用端口分别运行在同一台设备上的多个应用程序。,8,15.1.2,网络协议,3,IP,协议,IP,协议(,Internet Protocol,,网络之间互连的协议)是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守,IP,协议就可以与因特网互连互通。正是因为有了,IP,协议,因特网才得以迅速发展成为世界上最大的、开放的计算机通信网络。,IP,地址可以称为互联网地址或,Internet,地址,是用来惟一标识互联网上计算机的逻辑地址。每台连网计算机都依靠,IP,地址来标识自己,这就很类似于我们的电话号码样的。通过电话号码来找到相应的具体的电话。全世界的电话号码都是惟一的,,IP,地址也是一样。,9,15.1.3 OSI,参考模型,在计算机网络产生之初,每个计算机厂商都有一套自己的网络体系结构,它们之间互不兼容。为此,国际标准化组织(,ISO,)建立了一个专门的机构来研究一种标准的网络体系结构,来实现对网络的连接。这个标准即开放系统互联体系结构(,Open Systems Interconnection,,简称,OSI,)。它定义了连接不同类型计算机的标准框架。,10,15.1.3 OSI,参考模型,OSI,参考模型分为层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,如下图所示。,11,15.1.4 TCP/IP,参考模型,TCP/IP,协议(,Transfer Control Protocol/Internet Protocol,)叫做传输控制,/,网际协议,又叫网络通讯协议,这个协议是,Internet,国际互联网络的基础。,TCP/IP,参考模型分为四个层次:应用层、传输层、网络层和数据链路层。在,TCP/IP,参考模型中,去掉了,OSI,参考模型中的会话层和表示层(这两层的功能被合并到应用层实现)。同时将,OSI,参考模型中的数据链路层和物理层合并为链路层。,12,15.1.4 TCP/IP,参考模型,TCP/IP,与,OSI,参考模型的对应关系如下图所示。,13,15.1.5,网络编程相关概念,1.,端口,按照,OSI,七层参考模型,传输层提供进程通信的能力。为了表示通信实体中进行通信的进程,,TCP/IP,协议提出了协议端口(,Protocol Port,)的概念,简称端口。,端口是一种抽象的软件结构(包括一些数据结构和,I/O,缓冲区)。应用程序通过系统调用与某端口建立连接(,Binding,)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都要通过该端口输出。,端口使用一个,16,位的数字表示,所以它的范围为,065535,,,1024,以下的端口号保留给预定义的服务。例如,,http,使用的,80,端口。所以我们在编写网络应用程序时,要为程序制定,1024,以上的端口号。,14,15.1.5,网络编程相关概念,2.,套接字(,Socket,),为了能够方便的开发网络应用软件,由美国伯克利大学在,UNIX,上推出了一种应用程序访问通信协议的操作系统调用套接字(,Socket,)。,Socket,的出现,使程序员可以很方便地访问,TCP/IP,,从而开发各种网络应用程序。随着,UNIX,的应用推广,套接字在编写网络软件中得到了极大的普及。后来套接字又被引进了,Windows,等操作系统,称为开发网络应用程序非常有效快捷的工具。,。,15,15.1.5,网络编程相关概念,3.,网络字节顺序,字节顺序是指占内存多于一个字节的数据在内存中的存放顺序。通常有两种顺序,一种是低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;另一种是高字节数据存放在低地址处,低字节数据存放在高地址处。,由于不同的计算机存放多字节值的顺序不同,为保证数据的正确性,在网络协议中须指定网络字节顺序。,TCP/IP,协议使用,16,位整数和,32,位整数的高位先存(即起始地址存放高位字节)格式,它们均被含在协议头文件中。在网络中不同主机进行通信时,要同一采用网络字节顺序。,16,15.1.5,网络编程相关概念,4.,半相关与全相关,在网络通信中,可以使用一个三元组(协议、地址、端口号)来表示通信双方的一端。这样的一个三元组叫做一个半相关(,Half-association,)。一个完整的通信,需要由两个进程完成。可以使用一个五元组(协议、本地地址、本地端口号、远地地址、远地端口号)来表示通信的双方。这样一个五元组叫做一个全相关。,两个通信实体要进行通信,必须使用同一种高层协议。例如,通信双方必须同时使用,TCP,或,UDP,协议。两个协议相同的半相关才能组合成一个合适的全相关。,17,15.1.5,网络编程相关概念,5.,客户机,/,服务器模式,在,TCP/IP,网络中,通信的两个进程之间通常使用客户机,/,服务器模式(,Client/Server,),即客户端向服务器发送请求,服务器收到请求后提供相应的服务。,客户机,/,服务器模式的建立主要基于两点。首先是建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享。从而造成了拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等关系。其次是网间进程通信完全异步,互相通信的进程间既不存在父子关系,也不存在共享缓冲区。因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步。这就是基于客户机,/,服务器模式的,TCP/IP,。,18,15.1.5,网络编程相关概念,客户机,/,服务器模式在操作过程中采用的是主动请求方式。首先服务器方要先启动,并等待连接请求,其过程如下:,(,1,)打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求;,(,2,)等待客户请求;,(,3,)接收到服务请求,处理该请求,并发送应答信号;,(,4,)返回第二步,等待其他客户请求;,(,5,)关闭服务器。,19,15.1.5,网络编程相关概念,客户方需要主动连接到服务器,具体步骤如下:,(,1,)打开一通信通道,并连接服务器指定的端口;,(,2,)向服务器发送服务请求报文;,(,3,)等待并接收应答;,(,4,)请求结束后关闭通信通道。,20,15.1.6,VC+,对网络编程的支持,微软提供了在,Windows,下进行网络编程的结构,Windows Socket API,。使用,VC+,除了能利用,Windows Socket API,进行编程外,,MFC,还提供了专门的类让开发者能更方便的进行网络应用程序的开发。下面我们来介绍,VC+,对网络编程的支持有哪些。,21,15.1.6,VC+,对网络编程的支持,1.Windows Socket API,Windows,环境下进行网络程序设计的最基本方法是应用,Windows Sockets,实现进程间的通信。为此微软提供了大量基于,Windows Sockets,的通信,API,,如,WinSock API,、,WinInet API,和,ISAPI,,并一直致力于开发更快、更容易的通信,API,。在,Visual C+,中,完全可以利用这些,API,函数进行网络程序的开发,而不比附加任何其他内容。,22,15.1.6,VC+,对网络编程的支持,2.MFC WinSock,类,虽然,Windows Socket API,提供了强大的网络编程接口,但是只用它们来进行编程是一件非常烦琐的事情。为了方便程序员的开发,,MFC,对,Windows Socket API,进行了封装。,23,15.1.6,VC+,对网络编程的支持,3.WinInet,支持,一个,Internet,客户端程序的目的是通过像,HTTP,、,FTP,等,Internet,协议来存取服务器的信息。,WinInet,是指由,Microsoft,提供的,Internet,函数接口,这些函数由,WinInet.dll,动态库提供,程序员利用这些函数能方便地使用,HTTP,、,FTP,和,gopher,访问,Internet,,甚至还能进行,Finger,查询和,Whois,查询。,为了更方便的开发,Internet,应用程序,,MFC,将,WinInet,函数封装在一个类库中。在编写,WinInet,客户端应用程序时,既可以直接使用,Win32,函数,也可以使用,WinInet,类库。,MFC,提供了,13,个,WinInet,类,它们实现了一系列,Internet,访问功能。,24,15.1.6,VC+,对网络编程的支持,4.MAPI,支持,MAPI,是,Messaging Application Progrmming Interface,的缩写。,MAPI,提供了一组函数,能够支持邮件或邮件撰写应用程序的开发。,MFC,并没有封装整个,MAPI,函数集,但是可以在,MFC,应用程序中直接使用,MAPI,函数。在,MFC,的,CDocument,类中提供了,On,和,OnUpdate,函数支持邮件的发送。,25,15.1.6,VC+,对网络编程的支持,5.ISAPI,支持,ISAPI,是,Internet Server API,的简写,它提供了一种简单有效的方法来扩展与,ISAPI,兼容的,Web,服务器。,ISAPI,服务器扩展是可以被,HTTP,服务器加载和调用的,DLL,。,Internet,服务器扩展也称为,Internet,服务器应用程序(,ISA,),用于增强符合,Internet,服务器,API,(,ISAPI,)的服务器功能。,ISA,通过浏览器应用程序调用,并且将相似的功能提供给通用网关接口应用程序。,26,15.2 WinSock API,编程,WinSock API,是微软提供的网络编程接口。,VC+,对网络编程的支持有,socket,支持,,WinInet,支持,,MAPI,和,ISAPI,支持等。其中,,WinSock API,是,TCP/IP,网络环境里,也是,Internet,上进行开发最为通用的,API,。,27,15.2.1 WinSock API,常用函数,1.WSAStartup,函数,WSAStartup,函数主要实现加载套接字库和套接字库版本协商的功能,也就是确定将使用,socket,版本。该函数的原型声明如下所示。,28,15.2.1 WinSock API,常用函数,WSADATA,结构的定义如下所示:,29,15.2.1 WinSock API,常用函数,2.socket,函数,在完成对套接字库的加载之后,就可以调用,socket,函数来创建套接字了。该函数的原型声明如下所示。,30,15.2.1 WinSock API,常用函数,3.bind,函数,在创建了套接字后,我们通过,bind(),函数将该套接字绑定到本地的某个地址及端口上。该函数的原型声明如下所示。,31,15.2.1 WinSock API,常用函数,sockaddr,结构的定义如下所示:,32,15.2.1 WinSock API,常用函数,由于实际要求的只是内存区,所以对于不同的协议家族,用不同的结构来替代,sockaddr,。除了,sa_family,外,,sockaddr,是按网络字节顺序表示的。在基于,TCP/IP,的,socket,中,可以用,sockaddr_in,结构来表示,以方便填写地址信息。,sockaddr_in,的结构定义如下所示。,33,15.2.1 WinSock API,常用函数,4.inet_addr,函数和,inet_ntoa,函数,inet_addr(),函数实现将字符型,IP,地址转换为,Internet,地址值。其函数原型声明如下所示。,34,15.2.1 WinSock API,常用函数,inet_ntoa,函数完成相反的转换,它接受一个,in_addr,结构体类型的参数并返回一个以点分十进制格式表示的,IP,地址字符串。该函数的原型声明如下所示:,35,15.2.1 WinSock API,常用函数,5.listen,函数,当服务器端的,Socket,对象绑定之后,必须建立一个监听的队列来接收客户端的连接请求。,listen(),函数的作用是将指定的套接字设置为监听模式。其函数原型声明如下所示。,36,15.2.1 WinSock API,常用函数,6.accept,函数,当客户端提出连接请求时,服务器端通过调用,accept(),函数接受客户端的连接请求。该函数的原型声明如下所示。,37,15.2.1 WinSock API,常用函数,7.send,函数和,sendto,函数,我们利用,send,函数来发送数据,,send,函数通过一个已建立连接的套接字来完成数据的发送。其函数原型声明如下所示。,38,15.2.1 WinSock API,常用函数,如果我们想向一个特定的目的方式发送数据,可使用,sendto(),函数。其函数原型声明如下所示。,39,15.2.1 WinSock API,常用函数,8.recv,函数和,recvfrom,函数,recv,函数实现从建立连接或绑定的,socket,中接收数据,该函数的原型声明如下所示。,40,15.2.1 WinSock API,常用函数,如果我们要接收一个数据报信息并保存源地址,可通过,recvfrom(),函数实现。该函数的原型声明如下所示。,41,15.2.1 WinSock API,常用函数,10.connect,函数,connet(),函数用于建立一个连接到一个指定的,socket,。其函数原型声明如下所示。,42,15.2.1 WinSock API,常用函数,11.htonl,函数和,htons,函数,htonl,函数实现将,32,为主机字节顺序的长整型数据转换为,TCP/IP,网络字节顺序数据。其函数的原型声明如下所示。,43,15.2.1 WinSock API,常用函数,htons,函数实现将,16,位主机字节顺序的整型数据转换为,TCP/IP,网络字节顺序数据。其函数的原型声明如下所示。,44,15.2.2,基于,TCP,套接字编程步骤,TCP,(传输控制协议)是一种面向连接的、可靠的传输层协议。基于,TCP,套接字编程服务器端程序编写步骤如下:,(,1,)创建套接字(,socket,)。,(,2,)将一个套接字绑定到一个本地地址和端口上(,bind,)。,(,3,)将套接字设为监听模式,用来接收客户请求(,listen,)。,(,4,)等待客户请求,当接收到请求后接受连接请求,并返回一个新的对应于此次连接的套接字(,accept,)。,(,5,)用返回的套接字和客户端进行通信(,send/recv,)。,(,6,)返回,等待另一个客户请求。,(,7,)关闭套接字。,45,15.2.2,基于,TCP,套接字编程步骤,基于,TCP,的套接字编程,客户端程序编写步骤如下:,(,1,)创建套接字(,socket,)。,(,2,)向服务器发送连接请求(,connect,)。,(,3,)和服务器端进行通信(,send/recv,)。,(,4,)关闭套接字。,46,15.2.3,基于,TCP,套接字编程实例,下面我们编写一个基于对话框的,TCP,套接字程序,使读者对上面讲解的知识有更深刻的理解。首先编写服务端程序,然后再编写客户端程序。,1.,编写服务端程序,2.,编写客户端程序,47,15.2.4,基于,UDP,套接字编程步骤,UDP,(用户数据报协议)是一种无连接的客户,/,服务器通信协议。它不能保证数据报会被对方完全接收,也不保证他们抵达的顺序与发出时是一样的,但它的速度要比,TCP/IP,协议快的多。所以,对于某些不需要保证数据完整准确的场合或数据量很大的场合,通常蚕蛹,UDP,通信。,48,15.2.4,基于,UDP,套接字编程步骤,对于,UDP,套接字编程来说,它的服务器端和客户端概念不太强化,所以我们称之为接收端和发送端。接收端程序的编写步骤如下:,(,1,)创建套接字(,socket,)。,(,2,)将套接字绑定到一个本地地址和端口上(,bind,)。,(,3,)等待接收数据(,revcfrom,)。,(,4,)关闭套接字。,49,15.2.5,基于,UDP,套接字编程实例,下面,我们编写一个基于,UDP,协议的聊天软件。就像,QQ,客户端一样,实现两台电脑互相发送和接收消息的功能。,50,15.3,利用,MFC WinSock,类编程,在实际的应用中,我们已经几乎不在使用,Windows Socket API,来编写网络程序了。因为,MFC,为编程人员封装了,CAsyncSocket,和,CSocket,两个类,使我们能够更方便的实现网络通信。本节将针对这两个重要的类做简要的介绍。,51,15.3.1 MFC WinSock,类编程概述,直接利用,Windows Sockets API,编程,需要了解网络编程的框架,使用起来比较复杂。为了简化套接字网络编程,,MFC,提供了两个套接字类,对,Windows Sockets API,进行了不同层次的封装。一个是,CAsyncSocket,类、另一个是,CSocket,类。,52,15.3.1 MFC WinSock,类编程概述,CAsyncSocket,类对,Windows Sockets API,进行了很底层次的封装,它的成员函数和,Windows Sockets API,的函数调用直接对应。一个,CAsyncSocket,对象代表一个套接字。如果对网络通信的细节比较熟悉,仍希望充分利用,Windows Sockets API,编程的灵活性,可以选择,CAsyncSocket,进行编程。但是必须自己处理阻塞问题、字节顺序问题和字符串转换问题。,53,15.3.1 MFC WinSock,类编程概述,CSocket,类是,CAsyncSocket,类派生出来的,是对,Windows Sockets API,的高级封装。,CSocket,类继承了,CAsyncSocket,类的许多成员函数,这些函数封装了,Windows,套接字应用程序编程接口。在两个套接字类中,这些函数的用法是一致的。而,CSocket,类的高级,主要表现在,3,个方面:一、,CSocket,类可结合,CArchive,类来使用套接字;二、,CSocket,类管理了通信的许多方面,如字节顺序问题和字符串转换问题。而这些在使用原始,API,或,CAsyncSocket,类时,都必须由用户自己来解决。所以,,CSocket,类要比,CAsyncSocket,类更容易使用。三、,CSocket,类为,Windows,消息的后台处理提供了阻塞的工作模式,而这也是,CArchive,同步操作所必须的。,54,15.3.1 MFC WinSock,类编程概述,至于这两个类的主要区别也就是前者是异步通信,后者是同步通信;前者是非阻塞模式,后者是阻塞模式。下面我们只对,CSocket,类中的常用到的一些方法及其使用做简要介绍。,55,15.3.2,CSocket,类常用到的方法,1.AfxSocketInit(),函数,该函数作用为初始化,WinSock,,在使用,CSocket,前一定要先调用该函数,否则使用,CSocket,会出错。就算主线程调用了该函数,在子线程下使用,CSocket,也要先调用该函数。该函数的原型声明为如下。,56,15.3.2,CSocket,类常用到的方法,2.Create(),方法,通过调用,Create(),方法创建底层套接字句柄,并且决定套接字对象的具体特性。其函数的原型声明如下所示。,57,15.3.2,CSocket,类常用到的方法,3.Listen(),方法,通过调用,Listen(),函数,是监听套接字对象开始监听来自客户机端口的连接请求。此函数的原型声明如下所示。,58,15.3.2,CSocket,类常用到的方法,4.Connect(),方法,使用流式套接字需要事先建立客户机和服务端的连接,然后才能进行数据传输。在服务端套接字对象已经进入监听状态后,通过调用该函数向服务器发出一个连接请求。如果服务器接收到了这个连接请求,会返回,TRUE,,否则返回,FALSE,。该函数的原型声明如下所示。,59,15.3.2,CSocket,类常用到的方法,5.Accept(),方法,我们通过调用监听套接字对象中的,Accept,函数来接收客户端的连接请求。该函数的原型声明如下所示。,60,15.3.2,CSocket,类常用到的方法,6.Send(),方法,当服务器和客户机建立了连接之后,就可以通过服务器端的连接套接字对象和客户端的套接字对象来传输数据了。对于流式套接字对象,使用,Send(),函数来发送数据,使用,Receive(),函数从流式套接字接收数据。该函数的原型声明如下所示。,61,15.3.2,CSocket,类常用到的方法,7.Receive(),方法,我们使用,Receive,成员函数来接收流式套接字的数据,该函数的原型声明如下所示。,62,15.3.2,CSocket,类常用到的方法,8.close(),方法,在操作完成后,我们需要调用,Close,成员函数来关闭套接字。该函数没有参数,其原型声明如下所示。,63,15.3.3,CSocket,类编程实例,下面我们使用,CSocket,类来实现前面,15.2.5,小节中的聊天功能,与其不同的是我们使用的流式套接字。通过本例子,读者可以发现,用,CSocket,类来实现同样的功能,会节省很多代码。同时,也使网络编程变的很简单。,64,15.4,小结,本章首先介绍了网络编程的基础知识,了解这些基础知识对后面的编写网络程序是非常有必要的;然后我们介绍了,WinSock API,编程,通过例子会使读者对,TCP/UDP,协议编程会有更深刻的理解;最后我们简单的介绍了,WinSock API,的高级封装类,CSocket,。本章的难点是对网络基础知识的理解,以及编写,TCP/UDP,协议一般方法。本章的重点还是对网络基础知识的了解和,TCP/UDP,协议编程。,65,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


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

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


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