版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 WSAASYNCSELECT I/O 模型的程序设计1 实验目的 通过本次实验,掌握winsock提供了WSAASYNselect异步I/O模型,利用这个模型,应用程序可在一个套接字上,接收以windows消息为基础的网络事件通知。2 实验任务根据实验的要求完成,先画出实验程序的整体框架的流程图,明确步骤后。根据各步骤编写相应的程序,完成后,进行调试,修改,直至完成整个实验报告,最后撰写实验报告。3 实验设计方案 在应用程序中,首先必须用CreateWindow函数创建一个窗口,再为该窗口提供一个窗口例程支持函数(winproc)。应用程序在一个套接字上成功调用了WSAAsynselect之
2、后,应用程序会在与hwnd窗口句柄参数对应的窗口例程中以windows消息形式,接受网络事件通知。窗口例程windowPro的Wparam参数指定在其上面发生了一个网络事件的套接字。1Param的低字(低位字)指定了已发生的网络事件,而1Param参数的高字(高位字)包含了可能出现的任何错误代码,可用两个特殊的宏去获取低位字,高位字的值。4 算法,流程图及关键代码说明异步复用I/O模型的说明:异步I/O复用模型 Winsock提供了一个有用的异步I/O模型。利用这个模型,应用程序可在一个套接字上,接收以Windows消息为基础的网络事件通知。具体的做法是在建好一个套接字后,调用WSAAsync
3、Select函数。该模型最早出现于Winsock的1.1版本中,用于帮助应用程序开发者面向一些早期的16位Windows平台(如Windows for Workgroups),适应其“落后”的多任务消息环境。应用程序仍可从这种模型中得到好处,特别是它们用一个标准的Windows例程(常称为"WndProc"),对窗口消息进行管理的时候。 WSAAsyncSelect是简单的一种Winsock I/O模型(之所以说它简单是因为一个主线程就搞定了)。这里,我们需要做的是:1. 在WM_CREATE消息处理函数中,初始化Windows Socket libra
4、ry,创建监听套接字,绑定,监听,并且调用WSAAsyncSelect函数表示我们关心在监听套接字上发生的FD_ACCEPT事件;2. 自定义一个消息WM_SOCKET,一旦在我们所关心的套接字(监听套接字和客户端套接字)上发生了某个事件,系统就会调用WndProc并且message参数被设置为WM_SOCKET;3. 在WM_SOCKET的消息处理函数中,分别对FD_ACCEPT、FD_READ和FD_CLOSE事件进行处理;4.在窗口销毁消息(WM_DESTROY)的处理函数中,我们关闭监听套接字,清除Windows Socket library以下为各种I/O模型的介绍与WSAAsync
5、Select模型原理图I/O模型WSAAsyncSelect模型原理图程序设计流程图:对流程图进行解析:首先,我们得用描述主窗口的参数填充WNDCLASSEX结构,注册窗口类,之后便是创建主窗口,将主窗口显示出来(出错与否),然后创建套接字,WSAAsyncSelect,绑定套接字到本地机器,指定监听的端口号,创建监听套接字,进入监听模式,最后消息循环,退出系统。代码及说明#include "./common/initsock.h"#include <stdio.h>#define WM_SOCKET WM_USER + 101/ 自定义消息CInitSock
6、theSock;LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);int main()char szClassName = "MainWClass"WNDCLASSEX wndclass;/ 用描述主窗口的参数填充WNDCLASSEX结构wndclass.cbSize = sizeof(wndclass);wndclass.style = CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc = WindowProc;wndclass
7、.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = NULL;wndclass.hIcon = :LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = :LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH):GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szClassName ;wndclas
8、s.hIconSm = NULL;:RegisterClassEx(&wndclass); / 创建主窗口HWND hWnd = :CreateWindowEx( 0,szClassName,"",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,NULL,NULL);if(hWnd = NULL):MessageBox(NULL, "创建窗口出错!", "error", MB_OK);return -1;
9、USHORT nPort = 4567;/ 此服务器监听的端口号 注:此处4567为编写时端口,调试时用42247,42503两个端口测试。/ 创建监听套节字SOCKET sListen = :socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(nPort);sin.sin_addr.S_un.S_addr = INADDR_ANY;/ 绑定套节字到本地机器if(:bind(sListen, (sockaddr*)&sin, siz
10、eof(sin) = SOCKET_ERROR)printf(" Failed bind() n");return -1;/ 将套接字设为窗口通知消息类型。:WSAAsyncSelect(sListen, hWnd, WM_SOCKET, FD_ACCEPT|FD_CLOSE);/ 进入监听模式:listen(sListen, 5);/ 从消息队列中取出消息MSG msg;while(:GetMessage(&msg, NULL, 0, 0)/ 转化键盘消息:TranslateMessage(&msg);/ 将消息发送到相应的窗口函数:DispatchMes
11、sage(&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(lParam):closesocket(s);return 0;/ 处理发生的事件switch(WSAGETSELECTEVENT(lParam)case
12、 FD_ACCEPT:/ 监听中的套接字检测到有连接进入SOCKET client = :accept(s, NULL, NULL);:WSAAsyncSelect(client, 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", szText);break;case FD_C
13、LOSE: :closesocket(s);break;return 0;case WM_DESTROY:PostQuitMessage(0) ;return 0 ;/ 将我们不处理的消息交给系统做默认处理return :DefWindowProc(hWnd, uMsg, wParam, lParam); 5 调试结果运行调试截图6 改进意见与心得体会 通过此次实验,我们掌握了winsock提供了WSAASYNselect异步I/O模型,利用这个模型,应用程序可在一个套接字上,接收以windows消息为基础的网络事件通知。WASSsyncSelect模型的特点是将套接字绑定到窗口句柄,将网络事件与windows消息相关联。当套接字有网络事件发生时,将网络事件以windows消息的形式派发给绑定的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 客户服务满意度调查问卷设计指南提升客户体验
- 新材料研发行业科研项目管理方案
- 跨平台协作编辑模板与实时同步功能
- 企业行政事务操作手册模板
- 多功能销售业绩分析模板
- 北京市第七中学2025-2026学年初三一诊模拟考试(一)英语试题含解析
- 四川省遂宁第二中学2026届初三下第二次阶段(期中)数学试题含解析
- 山西省(大同)重点名校2026届宁夏银川二中下学期初三年级统练三英语试题含解析
- 流程化管理工具在人力资源配置中的实践
- 内蒙古包头市青山区重点中学2026年初三5月第一次单元测试-语文试题试卷含解析
- 2026浙江温州市公安局招聘警务辅助人员42人笔试参考题库及答案解析
- 2025四川长虹物业服务有限责任公司绵阳分公司招聘工程主管岗位测试笔试历年备考题库附带答案详解
- 2026广东茂名市公安局招聘警务辅助人员67人考试参考题库及答案解析
- 2026年希望杯IHC全国赛二年级数学竞赛试卷(S卷)(含答案)
- 中国抗真菌药物临床应用指南(2025年版)
- 2025-2026 学年下学期八年级英语下册教学计划
- 幼儿园春季育儿知识分享:守护成长健康同行
- 2026年六安职业技术学院单招职业适应性考试题库附答案详解(预热题)
- 2025年安徽审计职业学院单招职业适应性测试试题及答案解析
- 2026年春节后复工复产“开工第一课”安全生产培训课件
- 2025年西南计算机有限责任公司招聘笔试真题
评论
0/150
提交评论