二、windows网络编程基础.ppt_第1页
二、windows网络编程基础.ppt_第2页
二、windows网络编程基础.ppt_第3页
二、windows网络编程基础.ppt_第4页
二、windows网络编程基础.ppt_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

1、1,套接字,网络编程基础,编写网络程序人员忽略网络协议栈的工作细节,将套接字看做一个传递数据功能的对象,2,1)Windows Sockets的概念。它是一套网络编程机制(或规范),常简称为Winsock。该规范是在20世纪90年代初制定的,是在Windows操作系统下得到广泛应用的、开放的、支持多种协议的网络编程接口。 (2)Windows Sockets的来源。Sockets本来是UNIX操作系统下流行的一种网络编程接口(API),它是1983年在Berkeley(加州大学伯克利分校)4.2 BSD操作系统中被首先引入的,因此被称为“Berkeley Socket API”。 (3)Win

2、dows Sockets的版本。目前常用的Winsock有两个版本:一个是16位的Winsock l.1,由动态链接库WINSOCK.DLL提供支持;另一个是32位的Winsock 2.2,由动态链接库WSOCK32.DLL提供支持,Winsock概念,3,一般的网络系统都提供了以下3种不同类型的套接字: 流式套接字(SOCK_STREAM)。 数据报套接字(SOCK_DGRAM)。 原始套接字(SOCK_RAW)。 网络上所用应用程序的通信都是基于以上3种套接字进行的,如图1.35所示是网络上的两个Windows应用程序通过套接字通信的过程,套接字类型,4,基本概念,带外数据 广播 阻塞:函

3、数执行结束才返回 非阻塞:无条件返回,不论函数执行是否有需要的结果 客户机/服务器模型,5,字节顺序与转换,htons htonl ntohs ntohl,6,Winsock库,Winsock是windows下网络编程的标准接口,与协议无关的接口 Winsock有两个版本,winsock1和winsock2.开发winsock2程序需要在程序中包含头文件winsock2.h,并且要添加WS2_32.lib的链接,7,API函数,1 包含要调用函数的声明文件,即头文件 2 连接到指定的库文件,lib文件。VC默认已经连接了常用的lib文件。显式链接使用#pragma comment(lib,”W

4、S2_32.lib”) 3 API函数前面加:,表示一个全局函数的调用,与c+成员函数相区分。可以打开msdn查看相关信息,8,Winsock2与winsock1,Winsock2允许多种协议并存,而winsock把应用限定在TCP/IP里,winsock2可以透明地选择协议 Winsock1实现了API和TCP/IP协议的独占,winsock2定义了api和底层协议间的标准服务提供接口SPI,使得一个winsock dll能够同时访问不同软件开发商的多个底层协议栈 源码和二进制代码的向后兼容,实现和任何版本的winsock间的互操作性 Winsock2 引入重叠IO机制,9,Winsock库

5、的装入和释放,调用winsock函数前需要加载响应的winsock库,如果没有加载则winsock函数返回错误SOCKET_ERROR,出错代码是WSANOTINITIALISTED。加载winsock库的函数是WSAStartup,10,WSAStartup,wversionRequested参数用来指定想要加载的winsock库的版本,可以使用宏MAKEWORD(x,y)建立,x高字节,y低字节,11,lpWSAData,12,检测版本,If(LOBYTE(wsaData.wVersion)!=2)|HIBYTE(wsaData.wVersion)!=2) WSACleanup(); re

6、turn,13,函数调用成功返回0否则要用WSAGetLastError函数查看出错的原因 释放winsock库: Int WSACleanup(void,14,Winsock寻址,Winsock要兼容多个协议,因此要使用通用的寻址方式 struct sockaddr u_short sa_family; /指定地址家族 char sa_data14; /*协议相关的地址,不同的地址家族存储内容不同*/,15,Tcp/IP v4地址结构,struct sockaddr_in short sin_family; /*套接字地址族*/ U_short sin_port; /*16位的TCP或UDP

7、端口号*/ struct in_addr sin_addr; /*32位的IPv4地址*/ char sin_zero8; /*暂不用,总置为0*/,16,说明,Sin_family域设定为AF_INET,使用的是ipv4地址家族 Sin_port指定端口,端口号分成三种: 01023:IANA管理,公共服务使用 102449151 普通的用户注册的端口号 4915265535动态或私有的端口号 应使用1024以上的端口号,17,说明,Sin_addr存储IP地址,可以多种方式给它填充,因为内部是一个联合。逐字节、逐字或者直接双字填充 最后一个域sin_zero没有使用,为了与SOCKADDR

8、结构大小相同才设置的,18,字符串地址到值转换,Unsigned long inet_addr(const char* cp); 将“”这样的地址转换为网络顺序存储的32位二进制数 Char* inet_ntoa(struct in_addr in);将32位二进制数转换为字符串,19,WinsockTCP网络信息发送接收,服务端: 1套接字的创建和关闭 2 绑定套接字到指定的IP地址和端口号 3 设置套接字进入监听状态 4 接收连接请求 5 收发数据,客户端: 1 套接字创建和关闭 2 申请建立连接 3 收发数据 4 断开连接,关闭,20,任务,画出流程图 写出主要函数的名

9、字,21,22,UDP收发信息,服务端: 创建套接字 绑定IP地址和端口 收发数据 关闭连接,客户端: 创建套接字 收发数据 关闭连接,23,24,对套接字的操作,与一般文件对象操作类似,25,Winsock IO模型,阻塞模式 select模型 WSAAsyncSocket模型 WSAEventSelect模型 重叠IO模型 完成例程通知模型,26,套接字IO模型-阻塞模型,一般函数的执行效果 问题: 设计到外部设备的程序,完成函数并且返回的时机不成熟; 用户体验,要尽量优先响应用户的命令,而非阻塞于事务处理,27,非阻塞IO模型,服务器程序 同时维持多个连接的客户程序,28,非阻塞模型-选

10、择模型(select,类比:一个护士,负责联系一个楼层多个床位(套接字),事件主要类型有喝水,小便,打针,吃药。护士侧耳倾听,发现铃响,则去确定是哪一个床位的什么事件,处理之。讨论情况:多个人很短时间内都按动响铃如何处理? Select函数:检测是否有事件函数 套接字集合操作:删除,添加,清空,判断 网络事件 设置超时,29,使用流程,添加套接字到相应集合 调用select函数 检查是哪一个套接字的问题,30,WSAAsyncSelect模型,结合windows窗口事件通知方式 WSAAsyncSelect函数向窗口注册网络事件 一次新的使用本函数将使之前的效果消失,31,网络事件,FD_RE

11、AD FD_WRITE FD_OOB FD_ACCEPT FD_CONNECT FD_CLOSE,32,WSAEventSelect模型,创建事件对象 将事件与套接字关联 事件初始化为未授信 一旦有网络事件,则本事件对象为受信状态,程序去检查套接字并处理之 WSAEnumNetWorkEvents 枚举查看是什么网络事件,33,Winsock2的扩展特性-套接字异步函数,WSASend WSARecv AcceptEx,34,Overlapped I/O,Overlapped I/O也称Asynchronous I/O,异步I/O模型。异步I/O和同步I/O不同,同步I/O时,程序被挂起,一直

12、到I/O处理完,程序才能获得控制。异步I/O,调用一个函数告诉 OS,进行I/O操作,不等I/O结束就立即返回,继续程序执行,间隔一段时间,去检测是否完成,没完成继续其它事情,如果完成,则收尾工作。 操作系统完成I/O之后,发送通知消息给程序。Overlapped I/O只是一种模型,它可以由内核对象(hand),事件内核对象(hEvent), 异步过程调用(apcs) 和完成端口(I/O completion)实现,35,重叠IO模型-一次重叠写操作,1.填写一个OVERLAPPED结构2.进行一次写操作,并指定重叠操作参数(上面的OVERLAPPED结构变量的指针)3.做其它事(如更新界面

13、)4.GetOverlappedResult取操作结果5.如果IO请求没有完成,并且没有出错则回到期6.处理IO操作结果,36,多个调用组成一个发送接收缓冲队列,37,完成例程模型,一次重叠写操作过程(完成例程方法):1.填写一个OVERLAPPED结构2.进行一次写操作,并指定重叠操作参数(上面的OVERLAPPED结构变量的指针),并指定完成例程3.做其它事(如更新界面)4.当完成例程被调用说明IO操作已经完成或出错,现在可以对操作结果进行处理了,38,完成端口模型,重叠端口+线程池组合 一般线程数量为核心线程数量的2倍组成线程池,39,完成端口模式IOCP,与事件通知模式类似,也是提供一

14、个缓冲区给邮寄出去的网络事件,事件完成之后等待接收的线程会收到消息,进行后续处理,如FD_READ收到消息,则将其显示出来或保存起来等。与事件通知模式不同点在于,不是由事件有信号告知已完成,相当于系统提供了一个服务器称为完成端口对象,对外提供一个服务的窗口,线程可以到这个完成端口对象查询是否有已完成的事件,有的话则进行下一步处理,40,套接字选项和IO控制命令,getsockopt setsockopt ioctlsocket WSAIoctl,两种程序编写方式,1 直接使用API函数 2 利用MFC类库,41,42,WinInet网络编程,直接利用windows应用层类库编写程序,如 CHt

15、mlView类封装了http协议客户端行为,使用它的goback,stop,refresh等成员函数,即可实现相应功能 CFtpConnection,将ftp协议客户端行为封装在里边,使用ftpDeleteFile,getfile等函数即可实现常规的ftp功能,编程模型,1 创建CInternetSession类对象 2 建立CInternetSession对象与服务器的连接 3 queryOption或SetOption Internet请求选项 4 OnStatusCallback查询当前数据处理进程信息 5 CInternetFile获得服务器数据 6 read或write 7 错误处理

16、 8 结束会话,43,44,MFC Windows Sockets网络编程基础,CAsyncSocket类 CSocket类,CAsyncSocket编程模型,Create Accept Bind Listen Accept Connect Send SendTo Receive ReceiveFrom ShutDown Close 销毁CAsyncSocket类对象,45,其他,基于windows消息处理,因此套接字IO模型选择WSASyncSelect模型 当有消息时,触发消息响应:OnAccept,OnClose OnOutOfBandData OnReceive OnSend,46,其

17、它函数,Attach Detach FromHandle GetLastError GetPeerName GetSockName GetSockOpt AsyncSelect Ioctl,47,Csocket类,IsBlocking FromHandle Attach CancelBlockingCall OnMessagePending,48,Csocket对象与串行化技术,C+处理输入输出到控制台:cout,cin 串行化技术:不需程序员去管理存储细节。发送整个对象,接收方进行合理重组 举例:学生 student Char* name; Char* ID; Double score8; 此数据写入文件如何处理?串行化则由一个专门的转换服务器处理,49,Csocket编程模型,50,思考题,

温馨提示

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

评论

0/150

提交评论