《VC++程序设计》第9讲_WINSOCK网络编程.ppt
《《VC++程序设计》第9讲_WINSOCK网络编程.ppt》由会员分享,可在线阅读,更多相关《《VC++程序设计》第9讲_WINSOCK网络编程.ppt(80页珍藏版)》请在三一办公上搜索。
1、第9讲 WindSock网络编程,主讲教师:李璟e-mail:手机:13806419626,第9讲 WinSock网络编程,9.1网络通信基础9.2WinSock概述9.3MFC WinSock编程9.4MFC WinSock网络编程实例,9.1网络通信基础,网络编程是指:应用程序需要与网络中其它系统上的应用程序之间进行通信。以下介绍一下有关网络通信的基础知识。,计算机网络,计算机网络是相互连接的独立自主的计算机的集合,最简单的网络形式由两台计算机组成。,两台计算机通过网络进行通信,A,B,192.168.0.118,192.168.0.10,协议,协议,端口号,端口号,IP地址,IP网络中每
2、台主机都必须有一个惟一的IP地址;IP地址是一个逻辑地址;因特网上的IP地址具有全球唯一性;32位,4个字节,常用点分十进制的格式表示,例如:192.168.0.16,协议,为进行网络中的数据交换(通信)而建立的规则、标准或约定。(=语义+语法+规则)不同层具有各自不同的协议。,网络的状况,多种通信媒介有线、无线不同种类的设备通用、专用不同的操作系统Unix、Windows 不同的应用环境固定、移动 它们互相交织,形成了非常复杂的系统应用环境。,网络异质性问题的解决,网络体系结构就是使这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂,它营
3、造了一种“生存空间”任何厂商的任何产品、以及任何技术只要遵守这个空间的行为规则,就能够在其中生存并发展。网络体系结构解决异质性问题采用的是分层方法 把复杂的网络互联问题划分为若干个较小的、单一的问题,在不同层上予以解决。就像我们在编程时把问题分解为很多小的模块来解决一样。,ISO/OSI七层参考模型,OSI(Open System Interconnection)参考模型将网络的不同功能划分为7层。,应用层,表示层,物理层,会话层,传输层,网络层,数据链路层,处理网络应用,数据表示,主机间通信,端到端的连接,寻址和最短路径,介质访问(接入),二进制传输,ISO/OSI七层参考模型,通信实体的对
4、等层之间不允许直接通信。各层之间是严格单向依赖。上层使用下层提供的服务 Service user;下层向上层提供服务 Service provider。,对等通信示例,“你好”,“Hello”,传真,中国教师,翻译,秘书,“Hallo”,“Hello”,传真,德国教师,翻译,秘书,对交谈内容的共识,用英语对话,使用传真通信,物理通信线路,对等层通信的实质,对等层实体之间虚拟通信。下层向上层提供服务,实际通信在最底层完成。,OSI各层所使用的协议,应用层:远程登录协议Telnet、文件传输协议FTP、超文本传输协议HTTP、域名服务DNS、简单邮件传输协议SMTP、邮局协议POP3等。传输层:传
5、输控制协议TCP、用户数据报协议UDP。TCP:面向连接的可靠的传输协议。UDP:是无连接的,不可靠的传输协议。网络层:网际协议IP、Internet互联网控制报文协议ICMP、Internet组管理协议IGMP。,数据封装,一台计算机要发送数据到另一台计算机,数据首先必须打包,打包的过程称为封装。封装就是在数据前面加上特定的协议头部。,数据,数据,协议头,数据封装,OSI参考模型中,对等层协议之间交换的信息单元统称为协议数据单元(PDU,Protocol Data Unit)。OSI参考模型中每一层都要依靠下一层提供的服务。为了提供服务,下层把上层的PDU作为本层的数据封装,然后加入本层的头
6、部(和尾部)。头部中含有完成数据传输所需的控制信息。这样,数据自上而下递交的过程实际上就是不断封装的过程。到达目的地后自下而上递交的过程就是不断拆封的过程。由此可知,在物理线路上传输的数据,其外面实际上被包封了多层“信封”。但是,某一层只能识别由对等层封装的“信封”,而对于被封装在“信封”内部的数据仅仅是拆封后将其提交给上层,本层不作任何处理。,TCP/IP模型,TCP/IP起源于美国国防部高级研究规划署(DARPA)的一项研究计划实现若干台主机的相互通信。现在TCP/IP已成为Internet上通信的工业标准。TCP/IP模型包括4个层次:应用层传输层网络层网络接口,TCP/IP与OSI参考
7、模型的对应关系,7654321,OSI参考模型,TCP/IP模型,端口,按照OSI七层模型的描述,传输层提供进程(应用程序)通信的能力。为 了标识通信实体中进行通信的进程(应用程序),TCP/IP协议提出了协议端口(protocol port,简称端口)的概念。端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出。端口用一个整数型标识符来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自
8、的端口号也相互独立。端口使用一个16位的数字来表示,它的范围是065535,1024以下的端口号保留给预定义的服务。例如:http使用80端口。,9.2WinSock概述,Windows Sock(Windows套接字,简称WinSock)是微软根据UNIX操作系统中流行的Berkeley(伯克利)套接字规范,而实现的一套Microsoft Windows下的网络编程接口。,在ISO的OSI网络七层协议中,WinSock主要负责控制数据的输入和输出,也就是传输层和网络层。它屏蔽了数据链路层和物理层,给Windows下的网络编程带来了巨大的变化。,Windows Sockets通信机制,Wind
9、ows Sockets通信的基础是套接字(Socket)。Socket就是在应用程序之间用于读(接收信息)或写(发送信息)的一个网络对象。,客户机服务器模式,在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(client/server),即客户向服务器提出请求,服务器接收到请求后,提供相应的服务。,客户机服务器模式,客户机/服务器模式在操作过程中采取的是主动请求的方式。首先服务器方要先启动,并根据请求提供相应的服务:打开一个通信通道并告知本地主机,它愿意在某一地址和端口上接收客户请求。等待客户请求到达该端口。接收到服务请求,处理该请求并发送应答信号,同时要激活一
10、个新的进程(或线程)来处理这个客户请求。新进程(或线程)处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。返回第二步,等待另一客户请求。关闭服务器。客户方:打开一个通信通道,并连接到服务器所在主机的特定端口。向服务器发服务请求报文,等待并接收应答;继续提出请求。请求结束后关闭通信通道并终止。,基于TCP(面向连接)的socket编程,服务器端程序:1、创建套接字(socket)。2、将套接字绑定到一个本地地址和端口上(bind)。3、将套接字设为监听模式,准备接收客户请求(listen)。4、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的
11、对应于此次连接的套接字(accept)。5、用返回的套接字和客户端进行通信(send/receive)。6、返回第4步,等待另一客户请求。7、关闭套接字。,客户端程序:1、创建套接字(socket)。2、向服务器发出连接请求(connect)。3、和服务器端进行通信(send/receive)。4、关闭套接字。,9.3MFC WinSock编程,MFC为套接字提供了相应的类CAsynSocket和CSocket,它们封装了Windows Sockets的API,从而程序员可以用面向对象的方法调用Socket。基本类CAsySocket提供了全面的事件驱动的Socket通信能力,用户可以创建自己
12、派生的Socket类,来捕获和响应每个事件。CSocket类是CAsySocket的派生类,封装和简化了基本类的某些功能。,9.3MFC WinSock编程,9.3.1MFC WinSock类9.3.2WinSock初始化9.3.3Socket的创建、连接与关闭9.3.4数据的发送与接收,9.3.1MFC WinSock类,CAsyncSocket类是在一个很低的层次上封装了Windows Sockets API,只提供了一些基本的操作。CSocket则是由CAsyncSocket派生,是Windows Sockets API的高层抽象,提供了更高层次的功能。通过MFC WinSock类,开发
13、者可以不考虑网络字节顺序和忽略掉更多的通信细节。,CAsyncSocket类主要成员函数及其功能(一),构造函数CAsyncSocket:构造CAsyncSocket对象。Create:创建套接字。属性:Attach:对CAsyncSocket对象附加套接字句柄。Detach:从CAsyncSocket对象除去套接字句柄。FromHandle:返回CAsyncSocket对象的指针,给出套接字句柄。GetLastError:获得上一次运行失败的状态。GetPeerName:获得与套接字连接的对等套接字的地址。GetSockName:获得套接字的本地名。GetSockOpt:获得套接字选项。Se
14、tSockOpt:设置套接字选项。,CAsyncSocket类主要成员函数及其功能(二),操作函数:Accept:接受套接字上的连接请求。CAsyncSelect:请求对于套接字的事件通知。Bind:与套接字有关的本地地址。Close:关闭套接字。Connect:发出连接请求。IOCtr:控制套接字模式。Listen:建立套接字,监听即将到来的连接请求。Receive:从套接字上接收数据。Send:给连接套接字发送数据。SendTo:给特定目的地发送数据。ShutDown:使套接字上的send或receive调用无效。,CAsyncSocket类主要成员函数及其功能(三),可重载函数:OnAc
15、cept:通知侦听套接字,通过Accept接受连接请求。OnClose:通知套接字,关闭对它的套接字连接。OnConnect:通知连接套接字,连接尝试已经完成,无论成功或失败。OnReceive:通知侦听套接字,通过调用Receive接收数据。OnSend:通知套接字,通过调用Send,它可以发送数据。数据成员:m_hSocket:指定附加在此AsyncSocket对象上的SOCKET句柄。,CSocket类主要成员及其功能,构造函数:CSocket:构造一个CSocket对象。Create:创建一个套接字。属性:IsBlocking:确定一个阻塞调用是否在进行中。FromHandle:返回一
16、个指向CSocket对象的指针,给出一个套接字句柄。操作函数:CancelBlockingCall:取消一个当前在进行中的套接字调用。可重载函数OnMessagePending:当等待完成一个阻塞调用时调用此函数来处理悬而未决的消息。,9.3.2WinSock初始化,在使用WinSock MFC类之前,必须为应用程序初始化WinSock环境。这只需要调用实例初始化函数AfxSocketInit()即可。如下面的代码:BOOL CChatRoomServerApp:InitInstance()if(!AfxSocketInit()AfxMessageBox(IDP_SOCKETS_INIT_FA
17、ILED);return FALSE;,同时,在”stdafx.h”文件中添加如下代码:#include 如果在使用MFC AppWizardEXE创建MFC工程时,在MFC AppWizard step 2对话框选择”Windows Sockets”选项,则程序会自动添加上面的代码,实现WinSock的初始化。,9.3.3Socket的创建、连接与关闭,初始化Winsock环境后,即可以实现socket的创建、连接与关闭。1.创建Socket为了使应用程序可以使用Socket,首先需要声明CAsyncSocket、CSocket或者这两个类派生类的一个对象成员,如:CAsyncSocket
18、m_sock;,使用Socket对象之前,必须调用它的Create函数创建Socket。如果准备用Socket连接另一个应用程序,作为客户程序,不必给Create函数传送任何参数。而如果Socket作为服务程序,准备监听另一个应用程序的连接请求,则至少需要传送一个端口给Create函数:if(m_sock.Create(5800)/Socket创建成功后的代码else/错误处理代码Create函数的其他参数还有很多,可以包括Socket类型、准备响应的事件以及Socket的本地的IP地址等,一般情况下取默认值即可。,2.Socket连接建立Socket对象后,就可以创建一个连接,共需要以下3个
19、步骤:(1)在服务器端让Socket调用listen()函数,监听对方的连接请求。(2)在客户端通过调用Connect()函数连接服务器。(3)在服务器通过调用Accept()函数接受连接请求。,(1)在服务器端让Socket调用listen()函数,监听对方的连接请求。listen()函数的调用方式如下:if(m_sock.listen()/Socket监听成功后的代码else/错误处理代码,(2)在客户端通过调用Connect()函数连接服务器。使用Connect()函数连接服务器必须传达两个参数:连接的计算机名或IP地址和端口号。Connect()函数的调用方式如下:if(m_sock.
20、Connect(“127.0.0.1”,5802);/Socket连接成功后的代码else/错误处理代码,(3)一旦服务器监听到连接请求,CAsycnSocket类就激活OnAccept()事件,让应用程序知道已有连接请求,则服务器端必须调用Accept()函数接受连接请求。Accept()函数调用成功,将创建另一个Socket,通过它与对方应用程序连接。Accept()函数的调用方式如下:if(m_sock.Accept(m_sock2);/等待连接请求/连接请求成功后的代码else/连接请求失败后的代码m_sock2和客户方建立了连接,以后就通过这个m_sock2对象去和客户方进行通信,而
21、监听Socket m_sock仍然继续在监听,一旦又有一个客户方要连接服务方,OnAccept()又会被调用一次。m_sock2是和客户方通信的服务方,它不会触发OnAccept()事件,因为它不是监听Socket。,3.关闭Socket连接在应用程序之间的通信完成之后,就可以调用Close()函数关闭这个连接。如下:m_sock.close();,9.3.4数据的发送与接收,通过Socket提供的send()和Receive()函数可以实现任何类型数据的发送和接收。,1.发送通过Socket连接发送请求,可以使用Send()函数,该函数的原型如下:int CAsynSocket:Send(c
22、onst void*lpBuf,int nBufLen,int nFlags=0);各参数含义如下:lpBuf:指向发送数据缓冲区的指针。数据为CString变量时,可使用LPCTSTR操作符把CString变量作为缓冲区传送。nBuflen:指明缓冲区要发送数据的长度。nFlags:该参数是可选的,用于控制消息的发送方式。函数执行成功,返回发送到对方应用程序的数据总量。如果有错误产生,函数返回SOCKET_ERROR。,典型的Send()函数调用方式如下:char str1000;int ilen;int iSend;iLen=str.GetLength();iSend=m_sock.Sen
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC+程序设计 VC 程序设计 _WINSOCK 网络 编程
链接地址:https://www.31ppt.com/p-2241269.html