轻松学VisualC之网络编程.pptx

上传人:牧羊曲112 文档编号:6611123 上传时间:2023-11-17 格式:PPTX 页数:65 大小:960.35KB
返回 下载 相关 举报
轻松学VisualC之网络编程.pptx_第1页
第1页 / 共65页
轻松学VisualC之网络编程.pptx_第2页
第2页 / 共65页
轻松学VisualC之网络编程.pptx_第3页
第3页 / 共65页
轻松学VisualC之网络编程.pptx_第4页
第4页 / 共65页
轻松学VisualC之网络编程.pptx_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《轻松学VisualC之网络编程.pptx》由会员分享,可在线阅读,更多相关《轻松学VisualC之网络编程.pptx(65页珍藏版)》请在三一办公上搜索。

1、第15章 网络编程,随着Internet的普及,人们的生活已经越来越离不开网络。所以,编写网络程序成了每个开发人员必不可少的一项基本技能。VC+为编写网络程序提供了多种支持,使我们能更快更方便的的开发出满足需要网络应用程序。通过本章学习,读者也可以编写出即时的聊天程序。,15.1 网络编程基础,在使用VC+实现网络编程之前,我们有必要学习一下计算机网络的概念、一些常见的术语、还有计算机网络的协议等网络编程的基础知识。,15.1.1 计算机网络,计算机网络,即相互连接的独立自主的计算机集合,最简单的网络形式可以只由两台计算机组成,如下图所示。,15.1.1 计算机网络,在Internet上,为了

2、保证两台主机进行正常的通信,它们需要遵循约定的规则。我们把这种规则称之为协议。如果A主机和B主机采用同样的协议,它们之间就可以进行通信了。但是主机之间的通信往往不是单一的,一台计算机上可能有多个程序要完成网络的通信。例如,我们一边挂着QQ,一边还要看电影,一边还在用迅雷下载东西。那么当信息发送到某个IP地址的主机时,应该哪个程序来接收呢?,15.1.1 计算机网络,为了标识计算机上运行的每个网络应用程序,我们提出了端口的概念;每个网络应用程序都被分配了一个端口号。在发送数据时,除了指定接收数据主机的IP地址外,还要指定端口号。这样,在指定IP地址的计算机上,将会由与指定端口号相对应的网络应用程

3、序来接收数据。就好像我们打电话,IP地址就像是一个公司的总机号码,端口号就相当于分机号码。在打电话时,拨通总机后,还需要转到分机上,才能找到需要与你通话的人。,15.1.2 网络协议,网络协议是网络上所有设备之间通信规则、标准和约定的集合。不同的计算机之间必须使用相同的网络协议才能进行通信。TCP/IP协议是目前在网络中应用得最广泛的协议。TCP/IP是一个关于Internet的标准,并随着的Internet广泛应用而被大众所知,它也成为局域网所使用首选的协议。TCP/IP是一种分层协议,它共被分为个4层次。通过使用该协议,可以高效和可靠地实现各地的计算机相互连接。TCP/IP协议中的核心协议

4、有TCP(传输控制协议)、UDP(用户数据报协议)和IP(因特网协议)。,15.1.2 网络协议,1TCP协议TCP(Transmission Control Protocol/Internet Protocol,传输控制协议)提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。该协议主要用于在主机间建立一个虚拟连接,以实现高可靠性的数据包交换。IP协议可以进行IP数据包的分割和组装,但是通过IP协议并不能清楚地了解到数据包是否顺利地发送给目标计算机。而使用TCP协议就不同了,在该协议传输模式中在将数

5、据包成功发送给目标计算机后,TCP会要求发送一个确认;如果在某个时限内没有收到确认,那么TCP将重新发送数据包。另外,在传输的过程中,如果接收到无序、丢失以及被破坏的数据包,TCP还可以负责恢复。,15.1.2 网络协议,2UDP协议UDP协议(User Datagram Protocol,用户数据报协议)是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。,15.1.2 网络协议,3IP协议IP协议(Internet Protocol,网络之间互连的协议)是为计算机

6、网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。正是因为有了IP协议,因特网才得以迅速发展成为世界上最大的、开放的计算机通信网络。IP地址可以称为互联网地址或Internet地址,是用来惟一标识互联网上计算机的逻辑地址。每台连网计算机都依靠IP地址来标识自己,这就很类似于我们的电话号码样的。通过电话号码来找到相应的具体的电话。全世界的电话号码都是惟一的,IP地址也是一样。,15.1.3 OSI参考模型,在计算机网络产生之初,每

7、个计算机厂商都有一套自己的网络体系结构,它们之间互不兼容。为此,国际标准化组织(ISO)建立了一个专门的机构来研究一种标准的网络体系结构,来实现对网络的连接。这个标准即开放系统互联体系结构(Open Systems Interconnection,简称OSI)。它定义了连接不同类型计算机的标准框架。,15.1.3 OSI参考模型,OSI参考模型分为层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,如下图所示。,15.1.4 TCP/IP参考模型,TCP/IP协议(Transfer Control Protocol/Internet Protocol)叫做传输控制/网际协议,

8、又叫网络通讯协议,这个协议是Internet国际互联网络的基础。TCP/IP参考模型分为四个层次:应用层、传输层、网络层和数据链路层。在TCP/IP参考模型中,去掉了OSI参考模型中的会话层和表示层(这两层的功能被合并到应用层实现)。同时将OSI参考模型中的数据链路层和物理层合并为链路层。,15.1.4 TCP/IP参考模型,TCP/IP与OSI参考模型的对应关系如下图所示。,网络编程相关概念,1.端口按照OSI七层参考模型,传输层提供进程通信的能力。为了表示通信实体中进行通信的进程,TCP/IP协议提出了协议端口(Protocol Port)的概念,简称端口。端口是一种抽象的软件结构(包括一

9、些数据结构和I/O缓冲区)。应用程序通过系统调用与某端口建立连接(Binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都要通过该端口输出。端口使用一个16位的数字表示,所以它的范围为065535,1024以下的端口号保留给预定义的服务。例如,http使用的80端口。所以我们在编写网络应用程序时,要为程序制定1024以上的端口号。,网络编程相关概念,2.套接字(Socket)为了能够方便的开发网络应用软件,由美国伯克利大学在UNIX上推出了一种应用程序访问通信协议的操作系统调用套接字(Socket)。Socket的出现,使程序员可以很方便地访问TCP/IP,从

10、而开发各种网络应用程序。随着UNIX的应用推广,套接字在编写网络软件中得到了极大的普及。后来套接字又被引进了Windows等操作系统,称为开发网络应用程序非常有效快捷的工具。,网络编程相关概念,3.网络字节顺序字节顺序是指占内存多于一个字节的数据在内存中的存放顺序。通常有两种顺序,一种是低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;另一种是高字节数据存放在低地址处,低字节数据存放在高地址处。由于不同的计算机存放多字节值的顺序不同,为保证数据的正确性,在网络协议中须指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高位先存(即起始地址存放高位字节)格式,它们均被含在协议

11、头文件中。在网络中不同主机进行通信时,要同一采用网络字节顺序。,网络编程相关概念,4.半相关与全相关在网络通信中,可以使用一个三元组(协议、地址、端口号)来表示通信双方的一端。这样的一个三元组叫做一个半相关(Half-association)。一个完整的通信,需要由两个进程完成。可以使用一个五元组(协议、本地地址、本地端口号、远地地址、远地端口号)来表示通信的双方。这样一个五元组叫做一个全相关。两个通信实体要进行通信,必须使用同一种高层协议。例如,通信双方必须同时使用TCP或UDP协议。两个协议相同的半相关才能组合成一个合适的全相关。,网络编程相关概念,5.客户机/服务器模式在TCP/IP网络

12、中,通信的两个进程之间通常使用客户机/服务器模式(Client/Server),即客户端向服务器发送请求,服务器收到请求后提供相应的服务。客户机/服务器模式的建立主要基于两点。首先是建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享。从而造成了拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等关系。其次是网间进程通信完全异步,互相通信的进程间既不存在父子关系,也不存在共享缓冲区。因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步。这就是基于客户机/服务器模式的TCP/IP。,网络编程相关概念,客户机/服务器模式在操作过程中采用的是主动请求方式。首先服务

13、器方要先启动,并等待连接请求,其过程如下:(1)打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求;(2)等待客户请求;(3)接收到服务请求,处理该请求,并发送应答信号;(4)返回第二步,等待其他客户请求;(5)关闭服务器。,网络编程相关概念,客户方需要主动连接到服务器,具体步骤如下:(1)打开一通信通道,并连接服务器指定的端口;(2)向服务器发送服务请求报文;(3)等待并接收应答;(4)请求结束后关闭通信通道。,VC+对网络编程的支持,微软提供了在Windows下进行网络编程的结构Windows Socket API。使用VC+除了能利用Windows Socket API进

14、行编程外,MFC还提供了专门的类让开发者能更方便的进行网络应用程序的开发。下面我们来介绍VC+对网络编程的支持有哪些。,VC+对网络编程的支持,1.Windows Socket APIWindows环境下进行网络程序设计的最基本方法是应用Windows Sockets实现进程间的通信。为此微软提供了大量基于Windows Sockets的通信API,如WinSock API、WinInet API和ISAPI,并一直致力于开发更快、更容易的通信API。在Visual C+中,完全可以利用这些API函数进行网络程序的开发,而不比附加任何其他内容。,VC+对网络编程的支持,2.MFC WinSoc

15、k类虽然Windows Socket API提供了强大的网络编程接口,但是只用它们来进行编程是一件非常烦琐的事情。为了方便程序员的开发,MFC对Windows Socket API进行了封装。,VC+对网络编程的支持,3.WinInet支持一个Internet客户端程序的目的是通过像HTTP、FTP等Internet协议来存取服务器的信息。WinInet是指由Microsoft提供的Internet函数接口,这些函数由WinInet.dll动态库提供,程序员利用这些函数能方便地使用HTTP、FTP和gopher访问Internet,甚至还能进行Finger查询和Whois查询。为了更方便的开发

16、Internet应用程序,MFC将WinInet函数封装在一个类库中。在编写WinInet客户端应用程序时,既可以直接使用Win32函数,也可以使用WinInet类库。MFC提供了13个WinInet类,它们实现了一系列Internet访问功能。,VC+对网络编程的支持,4.MAPI支持MAPI是Messaging Application Progrmming Interface的缩写。MAPI提供了一组函数,能够支持邮件或邮件撰写应用程序的开发。MFC并没有封装整个MAPI函数集,但是可以在MFC应用程序中直接使用MAPI函数。在MFC的CDocument类中提供了OnFileSendMai

17、l和OnUpdateFileSendMail函数支持邮件的发送。,VC+对网络编程的支持,5.ISAPI支持ISAPI是Internet Server API的简写,它提供了一种简单有效的方法来扩展与ISAPI兼容的Web服务器。ISAPI服务器扩展是可以被HTTP服务器加载和调用的DLL。Internet服务器扩展也称为Internet服务器应用程序(ISA),用于增强符合Internet服务器API(ISAPI)的服务器功能。ISA通过浏览器应用程序调用,并且将相似的功能提供给通用网关接口应用程序。,15.2 WinSock API编程,WinSock API是微软提供的网络编程接口。VC

18、+对网络编程的支持有socket支持,WinInet支持,MAPI和ISAPI支持等。其中,WinSock API是TCP/IP网络环境里,也是Internet上进行开发最为通用的API。,15.2.1 WinSock API常用函数,1.WSAStartup函数WSAStartup函数主要实现加载套接字库和套接字库版本协商的功能,也就是确定将使用socket版本。该函数的原型声明如下所示。,15.2.1 WinSock API常用函数,WSADATA结构的定义如下所示:,15.2.1 WinSock API常用函数,2.socket函数在完成对套接字库的加载之后,就可以调用socket函数来

19、创建套接字了。该函数的原型声明如下所示。,15.2.1 WinSock API常用函数,3.bind函数在创建了套接字后,我们通过bind()函数将该套接字绑定到本地的某个地址及端口上。该函数的原型声明如下所示。,15.2.1 WinSock API常用函数,sockaddr结构的定义如下所示:,15.2.1 WinSock API常用函数,由于实际要求的只是内存区,所以对于不同的协议家族,用不同的结构来替代sockaddr。除了sa_family外,sockaddr是按网络字节顺序表示的。在基于TCP/IP的socket中,可以用sockaddr_in结构来表示,以方便填写地址信息。sock

20、addr_in的结构定义如下所示。,15.2.1 WinSock API常用函数,4.inet_addr函数和inet_ntoa函数inet_addr()函数实现将字符型IP地址转换为Internet地址值。其函数原型声明如下所示。,15.2.1 WinSock API常用函数,inet_ntoa函数完成相反的转换,它接受一个in_addr结构体类型的参数并返回一个以点分十进制格式表示的IP地址字符串。该函数的原型声明如下所示:,15.2.1 WinSock API常用函数,5.listen函数当服务器端的Socket对象绑定之后,必须建立一个监听的队列来接收客户端的连接请求。listen()

21、函数的作用是将指定的套接字设置为监听模式。其函数原型声明如下所示。,15.2.1 WinSock API常用函数,6.accept函数当客户端提出连接请求时,服务器端通过调用accept()函数接受客户端的连接请求。该函数的原型声明如下所示。,15.2.1 WinSock API常用函数,7.send函数和sendto函数我们利用send函数来发送数据,send函数通过一个已建立连接的套接字来完成数据的发送。其函数原型声明如下所示。,15.2.1 WinSock API常用函数,如果我们想向一个特定的目的方式发送数据,可使用sendto()函数。其函数原型声明如下所示。,15.2.1 WinS

22、ock API常用函数,8.recv函数和recvfrom函数recv函数实现从建立连接或绑定的socket中接收数据,该函数的原型声明如下所示。,15.2.1 WinSock API常用函数,如果我们要接收一个数据报信息并保存源地址,可通过recvfrom()函数实现。该函数的原型声明如下所示。,15.2.1 WinSock API常用函数,10.connect函数connet()函数用于建立一个连接到一个指定的socket。其函数原型声明如下所示。,15.2.1 WinSock API常用函数,11.htonl函数和htons函数htonl函数实现将32为主机字节顺序的长整型数据转换为TC

23、P/IP网络字节顺序数据。其函数的原型声明如下所示。,15.2.1 WinSock API常用函数,htons函数实现将16位主机字节顺序的整型数据转换为TCP/IP网络字节顺序数据。其函数的原型声明如下所示。,15.2.2 基于TCP套接字编程步骤,TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。基于TCP套接字编程服务器端程序编写步骤如下:(1)创建套接字(socket)。(2)将一个套接字绑定到一个本地地址和端口上(bind)。(3)将套接字设为监听模式,用来接收客户请求(listen)。(4)等待客户请求,当接收到请求后接受连接请求,并返回一个新的对应于此次连接的套接字(ac

24、cept)。(5)用返回的套接字和客户端进行通信(send/recv)。(6)返回,等待另一个客户请求。(7)关闭套接字。,15.2.2 基于TCP套接字编程步骤,基于TCP的套接字编程,客户端程序编写步骤如下:(1)创建套接字(socket)。(2)向服务器发送连接请求(connect)。(3)和服务器端进行通信(send/recv)。(4)关闭套接字。,15.2.3 基于TCP套接字编程实例,下面我们编写一个基于对话框的TCP套接字程序,使读者对上面讲解的知识有更深刻的理解。首先编写服务端程序,然后再编写客户端程序。1.编写服务端程序2.编写客户端程序,基于UDP套接字编程步骤,UDP(用

25、户数据报协议)是一种无连接的客户/服务器通信协议。它不能保证数据报会被对方完全接收,也不保证他们抵达的顺序与发出时是一样的,但它的速度要比TCP/IP协议快的多。所以,对于某些不需要保证数据完整准确的场合或数据量很大的场合,通常蚕蛹UDP通信。,基于UDP套接字编程步骤,对于UDP套接字编程来说,它的服务器端和客户端概念不太强化,所以我们称之为接收端和发送端。接收端程序的编写步骤如下:(1)创建套接字(socket)。(2)将套接字绑定到一个本地地址和端口上(bind)。(3)等待接收数据(revcfrom)。(4)关闭套接字。,15.2.5 基于UDP套接字编程实例,下面,我们编写一个基于U

26、DP协议的聊天软件。就像QQ客户端一样,实现两台电脑互相发送和接收消息的功能。,15.3 利用MFC WinSock类编程,在实际的应用中,我们已经几乎不在使用Windows Socket API来编写网络程序了。因为MFC为编程人员封装了CAsyncSocket和CSocket两个类,使我们能够更方便的实现网络通信。本节将针对这两个重要的类做简要的介绍。,15.3.1 MFC WinSock类编程概述,直接利用Windows Sockets API编程,需要了解网络编程的框架,使用起来比较复杂。为了简化套接字网络编程,MFC提供了两个套接字类,对Windows Sockets API进行了不

27、同层次的封装。一个是CAsyncSocket类、另一个是CSocket类。,15.3.1 MFC WinSock类编程概述,CAsyncSocket类对Windows Sockets API进行了很底层次的封装,它的成员函数和Windows Sockets API的函数调用直接对应。一个CAsyncSocket对象代表一个套接字。如果对网络通信的细节比较熟悉,仍希望充分利用Windows Sockets API编程的灵活性,可以选择CAsyncSocket进行编程。但是必须自己处理阻塞问题、字节顺序问题和字符串转换问题。,15.3.1 MFC WinSock类编程概述,CSocket类是CAs

28、yncSocket类派生出来的,是对Windows Sockets API的高级封装。CSocket类继承了CAsyncSocket类的许多成员函数,这些函数封装了Windows套接字应用程序编程接口。在两个套接字类中,这些函数的用法是一致的。而CSocket类的高级,主要表现在3个方面:一、CSocket类可结合CArchive类来使用套接字;二、CSocket类管理了通信的许多方面,如字节顺序问题和字符串转换问题。而这些在使用原始API或CAsyncSocket类时,都必须由用户自己来解决。所以,CSocket类要比CAsyncSocket类更容易使用。三、CSocket类为Windows

29、消息的后台处理提供了阻塞的工作模式,而这也是CArchive同步操作所必须的。,15.3.1 MFC WinSock类编程概述,至于这两个类的主要区别也就是前者是异步通信,后者是同步通信;前者是非阻塞模式,后者是阻塞模式。下面我们只对CSocket类中的常用到的一些方法及其使用做简要介绍。,CSocket类常用到的方法,1.AfxSocketInit()函数该函数作用为初始化WinSock,在使用CSocket前一定要先调用该函数,否则使用CSocket会出错。就算主线程调用了该函数,在子线程下使用CSocket也要先调用该函数。该函数的原型声明为如下。,CSocket类常用到的方法,2.Cr

30、eate()方法通过调用Create()方法创建底层套接字句柄,并且决定套接字对象的具体特性。其函数的原型声明如下所示。,CSocket类常用到的方法,3.Listen()方法通过调用Listen()函数,是监听套接字对象开始监听来自客户机端口的连接请求。此函数的原型声明如下所示。,CSocket类常用到的方法,4.Connect()方法使用流式套接字需要事先建立客户机和服务端的连接,然后才能进行数据传输。在服务端套接字对象已经进入监听状态后,通过调用该函数向服务器发出一个连接请求。如果服务器接收到了这个连接请求,会返回TRUE,否则返回FALSE。该函数的原型声明如下所示。,CSocket类

31、常用到的方法,5.Accept()方法我们通过调用监听套接字对象中的Accept函数来接收客户端的连接请求。该函数的原型声明如下所示。,CSocket类常用到的方法,6.Send()方法当服务器和客户机建立了连接之后,就可以通过服务器端的连接套接字对象和客户端的套接字对象来传输数据了。对于流式套接字对象,使用Send()函数来发送数据,使用Receive()函数从流式套接字接收数据。该函数的原型声明如下所示。,CSocket类常用到的方法,7.Receive()方法我们使用Receive成员函数来接收流式套接字的数据,该函数的原型声明如下所示。,CSocket类常用到的方法,8.close()

32、方法在操作完成后,我们需要调用Close成员函数来关闭套接字。该函数没有参数,其原型声明如下所示。,CSocket类编程实例,下面我们使用CSocket类来实现前面小节中的聊天功能,与其不同的是我们使用的流式套接字。通过本例子,读者可以发现,用CSocket类来实现同样的功能,会节省很多代码。同时,也使网络编程变的很简单。,15.4 小结,本章首先介绍了网络编程的基础知识,了解这些基础知识对后面的编写网络程序是非常有必要的;然后我们介绍了WinSock API编程,通过例子会使读者对TCP/UDP协议编程会有更深刻的理解;最后我们简单的介绍了WinSock API的高级封装类CSocket。本章的难点是对网络基础知识的理解,以及编写TCP/UDP协议一般方法。本章的重点还是对网络基础知识的了解和TCP/UDP协议编程。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号