Winsocket编程基础_第1页
Winsocket编程基础_第2页
Winsocket编程基础_第3页
Winsocket编程基础_第4页
Winsocket编程基础_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、一、网络编程基础1.1计算机网络概述计算机网络把分布在不同地点且具有独立功能的多个计算机系统通过通信设备和线路连接起来,在功能完善的软件和协议的管理下实现网络中资源共享。在工控领域,现场数据的采集、传输及控制信息的发送都依赖于计算机网络来实现。1.2、网络参考模型为什么要对网络进行分层设计?在计算机通信过程中需要通信协议,但因传输介质的不同、计算机本身的差异以及数据格式的不同等因素,致使网络通信相当复杂,为了降低复杂性,OSI提出了协议分层的参考模型,即OSI七层互联参考模型。因为OSI的网络模型标准比较严格,另外推出的时间也相对较晚,所以目前还没有完全按照OSI模型实现的网络。TCP/IP是

2、目前实际应用最广泛的一种网络模型,在这个模型中,不只是划分了功能层,还有具体的实现技术,即协议。TCP和IP就是这个模型中最重要的两个层次的代表协议。 1.2.1、OSI和TCP/IP参考模型在网络的不同分层中有不同的协议,计算机只能在同一层次上进行通信,如下图:虽然TCP/IP不是完全符合OSI的参考模型,但在层次上也存在着对应关系,如下图:1.2.2、数据流向在网络的层次模型中,每一层与相邻层之间都留有接口,较低层通过接口为上一层提供服务,中间层就像个翻译一样,如下图为经典的中德教师的对话过程:在TCP/IP网络模型中,数据在从应用层向网络接口层(链路层)传递的过程中,每经过一层都要加入该

3、层的相应的协议内容,这样数据在链路层形成了完整的数据包,该数据包到达接收方后,数据包从链路层到应用层进行逐层解析,在接收方应用层解析得到的数据就是发送方在应用层发送的数据,数据进行逐层封装和解析的过程如下图:1.2.3、IP分类IP地址在网络层中定义,长度为32个二进制位,分为4段,每段8位,用于主机在网络中的标识,IP地址有两部分组成,一部分为网络地址,另一部分为主机地址。IP地址分为A、B、C、D、E 共5类,具体如下: A 类: |0| + 网络号7位+主机号24位 -55 B 类: |1 0|+网络号14位+主机号16位 -

4、55 C 类: |1 1 0|+网络号21位+主机号8位 -55 D 类: |1 1 1 0|+网络号28位多播组号 -55 E 类: |1 1 1 1 0|+27位留待后用 在使用IP地址进行通信时,可分为单播、组播和广播三种通信方式。单播即网络节点之间进行点到点的通信;组播,又称多播,常用于视频会议,由一个节点向指定的一组节点逐个发送数据,多播使用D类IP地址。广播类似组播,只是它不区分子网中的节点,也就是对所有节点发送数据,因此占用整个网络带宽,广播使用固定的IP” 25

5、55”。1.3、软件系统结构C/S(Client/Server)结构,即大家熟知的客户机和服务器结构,根据实际情况对服务器和客户端进行合理的分配任务,一方面可以减少网络通信的开销,另一方面降低了服务器的压力,在这种结构下,客户端相对独立地分担了一些任务,使其功能丰富,换个角度也称这样的客户端为胖客户端。B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,主要事务逻辑在服务器端(Server)实现,用户通过WWW浏览器获取需要的服务,因极少部分事务逻辑在前端(Browser)

6、实现,因此也可称为瘦客户端。在工控领域,一二级控制系统因为对系统实时性要求较高,一般都采用C/S结构,而高层的信息管理系统大多采用B/S结构。二、SOCKET编程2.1、SOCKET概述SOCKET是在TCP/IP协议下进行网络编程的接口,在编写网络软件时,用户不用关系底层协议是如何实现的,SOCKET提供了一些API使网络编程变得相对简单。SOCKET是由伯克利大学分校设计,最早主要用于在UNIX进行网络开发,微软在此基础上对其进行扩展,称其为WinSocket,扩展的socket API一般都以WSA开头,在windows上进行网络编程,基本的socket函数和扩展的socket函数都可以

7、使用。2.2、同步(阻塞)/异步(非阻塞)同步是指计算机的IO操作不能同时进行,也就是计算机系统内核在进行IO操作时,线程处于等待状态(阻塞),在内核完成IO操作后,等待的线程才继续执行。异步是相对于同步而言,线程在向系统内核提出IO操作请求后继续执行,线程通过内核定义的信号状态判断IO操作是否完成。同步IO操作相对简单,但异步IO会使整个软件有更高的性能,但开发难度较大。2.3、基本开发步骤TCPUDP三、网络IO模型Winsock提供了五种 IO模型:选择(Select)、异步选择(WSAAsyncSelect)、事件选择(WSAEventSelect)、重叠I/O(Overlapped

8、I/O)和完成端口(Completion Port)共五种I/O模型。每种模型都有各自的特点,应用程序应根据实际需要选择合适的IO模型。1. 选择模型之所以叫做“选择”模型,是因为该模型以select函数为核心,该模型最初主要是面向UNIX操作系统,使用该模型可以避免程序阻塞或在非阻塞模式下IO操作返回错误。如果你选择的是同步socket,读写操作会被阻塞,这可以通过多线程来解决,但是如果有多个socket需要进行读写,使用多线程的方法就十分有限了。选择异步socket不会阻塞,但在socket不可操作时进行读写会返回错误,而且也不知何时socket才能可以读写,轮询的方式又会降低程序的性能,

9、使用select则可以解决这样的问题。在这个模型中,你可以通过select函数选择你所关心的socket,select会为你监听你所关心的socket的状态,直到这些socket可以操作select才返回。下面给出一个典型的选择模型开发步骤:2. 异步选择模型在这个模型中,应用程序可以在socket上接收以windows消息为基础的网络事件通知,根据通知内容进行执行相应的动作,如果你在开发一个界面应用程序,希望处理网络事件像处理一般的消息一样,选择这个模型就非常合适。这个模型中的关键函数为WSAAsyncSelect,原型如下:int WSAAsyncSelect ( SOCKET s, /你

10、所关注的socket句柄 HWND hWnd, /用于接收socket消息的窗口句柄 unsigned int wMsg, /一个你自己定义的消息,网络事件以此消息通知 long lEvent /网络事件掩码);这个函数将socket和窗口通过消息建立关联,在socket上有事件发生时,系统会将该函数指定的消息发送给该函数所指定窗口,然后系统再调用窗口过程处理该消息。在窗口收到的消息中,wParam 就是socket句柄 ,lParam代表网络事件和错误代码,window提供两个宏:WSAGETSELECTERROR(lParam) 提取错误代码,通过WSAGetLastError可以获得错误

11、信息;WSAGETSELECTEVENT(lParam)提取网络事件,网络事件常用的有FD_READ|FD_WRITE|FD_CLOSE|FD_ACCEPT|FD_CONNECTION等,这样我们收到一个socket消息后,就知道了在哪个socket上发生了什么事件。3. 事件选择模型异步选择模型以处理窗口消息的方式处理网络事件,对于开发窗口程序比较方便,而对于一个没有窗口的程序则需要建立一个隐藏窗口。针对异步选择模型的不足,WinSocket提供了事件选择模型,该模型与异步选择模型类似,只不过它是基于内核事件而异步选择模型基于窗口。我们通过WSAEventSelect将socket与内核事件

12、建立关联,原型如下:int WSAEventSelect ( SOCKET s, /socket WSAEVENT hEventObject, /内核事件 long lNetworkEvents /网络事件);WinSocket对内核事件进行了封装,如将CreateEvent 封装为WSACreateEvent,将HANDLE封装为WSAEVENT,两者使用方法类似。WSAEVENT 与EVENT一样有两种状态:有信号、无信号,等待事件信号的方法也类似,普遍的EVENT使用WaitForMultipleObjects,而等待WSAEVENT信号使用WSAWaitForMultipleEvent

13、s,原型如下:DWORD WSAWaitForMultipleEvents( DWORD cEvents, /第二个参数WSAEVENT 的总数 const WSAEVENT FAR *lphEvents, / WSAEVENT指针,通过数组传入多个 BOOL fWaitAll, /是否等待全部事件都有信号才返回 DWORD dwTimeOUT, /超时 BOOL fAlertable /在该模型中不用,固定设为FALSE);如何知道是哪个socket发生事件?用WSAWaitForMultipleEvents的返回值减去WSA_WAIT_EVENT_0就是第二个参数lphEvents指向的数

14、组标号,为此要将保存的socket句柄数组和事件数组一一对应,知道数组标号,也就知道了发生事件的socket。知道了哪个socket,如何知道在这个socket上发生了什么事件?通过函数WSAEnumNetworkEvents 可以获得,原型如下:int WSAEnumNetworkEvents ( SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents );前两个参数我们已经知道,第三个参数为WSANETWORKEVENTS的结构体指针,该结构体定义如下:typedef struct _WSANETWORKEVE

15、NTS long lNetworkEvents;/事件代码 int iErrorCodeFD_MAX_EVENTS;/错误代码 WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;将事件与“求与”如FD_READ, 如果结果非零,则说明该事件发生了if (FD_READ & tNetEvents.lNetworkEvents)/ 收到数据if (0 != tNetEvents.iErrorCodeFD_READ_BIT) /错误代码 4. 重叠IO模型与之前的IO模型相比,重叠IO模型具有较高的读写效率,在投递一个IO操作后,系统直接操作应用程序中的缓

16、冲区,而不是先操作socket缓冲区之后再拷贝到应用程序的缓冲区。该模型效率高,但使用上也比较复杂,比较适合实时数据采集或者在传输大的文件时应用,大致开发步骤如下:1)创建一个套接字,开始在指定的端口上监听连接请求。2)接受一个进入的连接请求。3)为接受的套接字新建一个WSAOVERLAPPED结构,并为该结构分配一个事件对象句柄。也将事件对象句柄分配给一个事件数组,以便稍后由WSAWaitForMultipleEvents函数使用。4)在套接字上投递一个异步WSARecv请求,指定参数为WSAOVERLAPPED结构。5)使用步骤3)的事件数组,调用WSAWaitForMultipleEve

17、nts函数,并等待与重叠调用关联在一起的事件进入"已传信"状态6)WSAWaitForMultipleEvents函数完成后,事件数组,调用WSAResetEvent函数,从而重设事件对象,并对完成的重叠请求进行处理.7)使用WSAGetOverlappedResult函数,判断重叠调用的返回状态是什么.8)在套接字上投递另一个重叠WSARecv请求.9)重复步骤58.5.完成端口模型完成端口模型据称是目前效率最高也最复杂的模型,但它只适用于NT和2000系统,在一个应用程序需要与大量的客户端连接时,比较适合使用此模型,如开发游戏服务器。它的主要思想是将众多的socket映

18、射到一个叫完成端口的对象上,通过这个完成端口来管理与客户端的通信。在创建这个完成端口时需要指定CPU数量,根据CPU数量建立相应的线程,CPU数量越大,应用程序运行效率越高。四、基于MFC的socket编程1、CAsyncSocket这个类实际上是对socket异步选择模型的封装,在建立一个CAsyncSocket对象后,它内部创建了一个隐藏的CSocketWnd窗口,该窗口根据收到的消息类型调用CAsyncSocket定义虚函数,这样我们只需要重载这些虚函数完成所需要的操作即可。 OnAccept 通知侦听套接字,它可以通过调用Accept,接受挂起连接请求 OnClose 通知套接字,关闭对它的套接字连接 OnConnect 通知连接套接字,连接尝试已经完成,无论成功或失败 OnOutOfBandData 通知接收套接字,在套接字上有带外数据读入,通常是忙消息 OnReceive 通知侦听套接字,通过调用Receive恢复数据 OnSend

温馨提示

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

评论

0/150

提交评论