


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一. 实验目的通过本次实验,掌握 win sock提供了 WSAASYNselect异步I/O模型,利用 这个模型,应用程序可在一个套接字上,接收以 windows消息为基础的网络事 件通知。二. 实验任务根据实验的要求完成,先画出实验程序的整体框架的流程图,明确步骤后。 根据各步骤编写相应的程序,完成后,进行调试,修改,直至完成整个实验报告, 最后撰写实验报告。三. 实验设计方案在应用程序中,首先必须用 C reateWindow函数创建一个窗口,再为该窗 口提供一个窗口例程支持函数(win proc )。应用程序在一个套接字上成功调用 了 WSAAsynselect之后,应用程序会在与hw
2、nd窗口句柄参数对应的窗口例程中 以windows消息形式,接受网络事件通知。窗口例程windowPro的Wparam参数指定在其上面发生了一个网络事件的套接字。1Param的低字(低位字)指定了已发生的网络事件,而1Param参数的高字(高位字)包含了可能出现的任何 错误代码,可用两个特殊的宏去获取低位字,高位字的值。四. 算法,流程图及关键代码说明异步复用I/O模型的说明:异步I/O复用模型W i ndows消息机制WinMain() while(l) 取出消息;调用消息处理函数;>Win sock提供了一个有用的异步I/O模型。利用这个模型,应用程序可在一个套接字上,接收以Wind
3、ows消息为基础的网络事件 通知。具体的做法是在建好一个套接字后,调用WSAAsy ncSelect函数。该模型最早出现于 Win sock的1.1版本中,用于帮助应用程序开 发者面向一些早期的16位Windows平台(如Windows for Workgroups),适应其“落后”的多任务消息环境。应用程序仍可从这种模型中得到好处,特别是它们用一个标准的Windows例程(常称为"WndProc"),对窗口消息进行管理的时候。*函数定义int WSAAsyncSelect(SOCKETs, HWND hWn£ unsigned int wMsg long /Ev
4、ent)值含义FDREAD期望在套接字留上收到数据时接到通知FD_WRITE期望在套接字務工可发送数据时接到通知FD OOB期望在套接字名上有带外数据商达时接到通知FDACCEPT期望在套接字$上有外来连接时接到通知FD_CONNEC期望在套接字歩上连接建立完成时接到通知T-FD CLOSE期望在套接字咲闭时接到通知WSAAsy ncSelect是简单的一种 Win sock I/O 模型(之所以说它简单是因为一个 主线程就搞定了)。这里,我们需要做的是:1. 在 WM_CREATE息处理函数中,初始化 Windows Socket library ,创建监听 套接字,绑定,监听,并且调用 W
5、SAAsy ncSelect函数表示我们关心在监听套接 字上发生的FD_ACCEF事件;2. 自定义一个消息WM_SOCKE一旦在我们所关心的套接字(监听套接字和客户 端套接字)上发生了某个事件,系统就会调用WndProc并且message参数被设置 为 WM_SOCKET3. 在 WM_SOCKET消肖息处理函数中,分别对 FD_ACCEPTFD_REA併口 FD_CLOSE 事件进行处理;4. 在窗口销毁消息(WM_DESTRO的处理函数中,我们关闭监听套接字,清除Win dows Socket library以下为各种I/O模型的介绍与WSAAsyncSelect模型原理图I/O模型WS
6、AAsyncSelect模型原理图程序设计流程图:I注册窗口类I 对流程图进行解析:首先,我们得用描述主窗口的参数填充WNDCLASSEX结构,注册窗口类,之后便是创建主窗口,将主窗口显示出来(出错与否),然后创建套接字,WSAAsy ncSelect,绑定套接字到本地机器,指定监听的端口号, 创建监听套接字,进入监听模式,最后消息循环,退出系统。 代码及说明#in elude "./com mon/in itsock.h"/自定义消息#i nclude <stdio.h> #defi ne WM_SOCKET WM_USER + 101 CI nitSock
7、theSock;LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM IParam);int main()char szClassName = "Mai nWClass"WNDCLASSEX wn dclass;/用描述主窗口的参数填充 WNDCLASSEX结构wn dclass.cbSize = sizeof(w ndclass);wn dclass.style = CS_HREDRAW|CS_VREDRAW;wn dclass .IpfnWn dProc = Win dowProc
8、;wn dclass.cbCIsExtra = 0;wn dclass.cbWndExtra = 0;wn dclass.hI nsta nee = NULL;wn dclass.hIc on = :LoadIc on (NULL, IDI_APPLICATION);wn dclass.hCursor = :LoadCursor(NULL, IDC_ARROW);wn dclass.hbrBackgrou nd = (HBRUSH):GetStockObject(WHITE_BRUSH);wn dclass .l pszMe nu Name = NULL;wn dclass.lpszClass
9、Name = szClassName ;wn dclass.hIco nSm = NULL;:RegisterClassEx(&wn dclass);/创建王窗口HWND hWnd = :CreateWi ndowEx(0,szClassName,IlliJWS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,NULL,NULL);if(hWnd = NULL):MessageBox(NULL,"创建窗口出错! ", "error"
10、;, MB_OK);return -1;USHORT nPort = 4567; /此服务器监听的端口号注:此处4567为编写时端口,调试时用42247,42503两个端口测试/创建监听套节字SOCKET sListen = :socket(AFN ET, SOCK_STREAM, IPPROTO_TCP); sockaddr_i n sin;si n.sin_family = AF_INET;sin .sin_port = htons(n Port);si n.sin_addr.S_u n.S_addr = INADDR_ANY;/绑定套节字到本地机器if(:bi nd(sListe n,
11、(sockaddr*)&sin, sizeof(s in) = SOCKET_ERROR) _printf(" Failed bi nd() n");return -1;/将套接字设为窗口通知消息类型。:WSAAsy ncSelect(sListe n, hWnd, WM_SOCKET, FD_ACCEPT|FD_CLOSE);/进入监听模式:liste n( sListe n, 5);/从消息队列中取出消息MSG msg;while(:GetMessage(&msg, NULL, 0, 0)/转化键盘消息:Tra nslateMessage(&ms
12、g);/将消息发送到相应的窗口函数:DispatchMessage(&msg);/当GetMessage返回0时程序结束return msg.wParam;LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)switch (uMsg)case WM_SOCKET:/取得有事件发生的套节字句柄SOCKET s = wParam;/查看是否出错if(WSAGETSELECTERROR(IParam):closesocket(s); return 0;/处理发生的事件switch(WSA
13、GETSELECTEVENT(IParam)case FD_ACCEPT:/监听中的套接字检测到有连接进入SOCKET clie nt = :accept(s, NULL, NULL);:WSAAsy ncSelect(clie nt,hWnd, WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);break;case FD_WRITE:break;case FD_READ:char szText1024 = 0 ;if(:recv(s, szText, 1024, 0) = -1):closesocket(s);elseprintf("接收数据:%s"
14、;, szText);break;case FD_CLOSE: _:closesocket(s);break;return 0;case WM_DESTROY:PostQuitMessage(O);return 0 ;/将我们不处理的消息交给系统做默认处理return :DefWi ndowProc(hWnd, uMsg, wParam, lParam);五. 调试结果运行调试截图icperverWSAAspicSilct 器示例:5二个连摄球堆址:127 :TCF Client : TO? Sir ver Vtao!it: 127.0.0 1 端口号:If0 0 I 購口暑:4224742247关雕接眇一个達接IF葩址127 闌|: TCF Client鼬留:TCP Ssrv'ir Dmo1 i: m.o o i 端号0.0 1 讓号:4250342503背痢连接.六. 改进意见与心得体会通过此次实验,我们掌握了 win sock提供了 WSAASYNselect异步I/O模 型,利用这个模型,应用程序可在一个套接字上,接收以windows消息为基础的网络事件通知。WASSsy ncSelect模型的特点是将套接字绑定到窗口句柄,将 网络事件与 windows消息相关联。当套接字有网络事件发生时,将网络事件以 windo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《2025合同终止或解除劳动合同的证明范文》
- 工程经济项目可持续性试题及答案
- 工程经济中风险管理试题及答案
- 工程经济考试难点总结试题及答案
- 常见问题解答中级经济师试题及答案
- 工程经济投资决策支持试题及答案
- 2025年中级经济师考试计划与你的试题及答案
- 2025年工程经济综合技能试题及答案
- 市政工程交通管理试题及答案
- 2025年市政工程考试各章重点试题及答案
- 上海建设工程通用硅酸盐水泥质量检验报告 - 上海水泥行业协会
- NY T 1145-2006 温室地基基础设计丶施工与验收技术规范
- 餐饮服务六大技能培训.ppt
- 基于单片机的电话拨号系统的设计毕业论文
- 叉车产品数据表
- 高填方、深挖路堑边坡和软基监测方案
- 批发零售大个体 E204-3批发和零售业产业活动单位(个体经营户)商品销售和库存
- 机器人学导论(课堂PPT)
- 机电设备维修与管理专业毕业论文30442
- 300MW电站回热系统的结构优化
- 型钢混凝土结构施工方案(完整版)
评论
0/150
提交评论