WSAASYNCSELECTIO模型的程序设计.docx

上传人:b****2 文档编号:1345959 上传时间:2023-04-30 格式:DOCX 页数:11 大小:210.36KB
下载 相关 举报
WSAASYNCSELECTIO模型的程序设计.docx_第1页
第1页 / 共11页
WSAASYNCSELECTIO模型的程序设计.docx_第2页
第2页 / 共11页
WSAASYNCSELECTIO模型的程序设计.docx_第3页
第3页 / 共11页
WSAASYNCSELECTIO模型的程序设计.docx_第4页
第4页 / 共11页
WSAASYNCSELECTIO模型的程序设计.docx_第5页
第5页 / 共11页
WSAASYNCSELECTIO模型的程序设计.docx_第6页
第6页 / 共11页
WSAASYNCSELECTIO模型的程序设计.docx_第7页
第7页 / 共11页
WSAASYNCSELECTIO模型的程序设计.docx_第8页
第8页 / 共11页
WSAASYNCSELECTIO模型的程序设计.docx_第9页
第9页 / 共11页
WSAASYNCSELECTIO模型的程序设计.docx_第10页
第10页 / 共11页
WSAASYNCSELECTIO模型的程序设计.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

WSAASYNCSELECTIO模型的程序设计.docx

《WSAASYNCSELECTIO模型的程序设计.docx》由会员分享,可在线阅读,更多相关《WSAASYNCSELECTIO模型的程序设计.docx(11页珍藏版)》请在冰点文库上搜索。

WSAASYNCSELECTIO模型的程序设计.docx

WSAASYNCSELECTIO模型的程序设计

WSAASYNCSELECTI/O模型的程序设计

一.实验目的

通过本次实验,掌握winsock提供了WSAASYNselect异步I/O模型,利用这个模型,应用程序可在一个套接字上,接收以windows消息为基础的网络事件通知。

二.实验任务

根据实验的要求完成,先画出实验程序的整体框架的流程图,明确步骤后。

根据各步骤编写相应的程序,完成后,进行调试,修改,直至完成整个实验报告,最后撰写实验报告。

三.实验设计方案

在应用程序中,首先必须用CreateWindow函数创建一个窗口,再为该窗口提供一个窗口例程支持函数(winproc)。

应用程序在一个套接字上成功调用了WSAAsynselect之后,应用程序会在与hwnd窗口句柄参数对应的窗口例程中以windows消息形式,接受网络事件通知。

窗口例程windowPro的Wparam参数指定在其上面发生了一个网络事件的套接字。

1Param的低字(低位字)指定了已发生的网络事件,而1Param参数的高字(高位字)包含了可能出现的任何错误代码,可用两个特殊的宏去获取低位字,高位字的值。

 

四.算法,流程图及关键代码说明

异步复用I/O模型的说明:

异步I/O复用模型

Winsock提供了一个有用的异步I/O模型。

利用这个模型,应用程序可在一个套接字上,接收以Windows消息为基础的网络事件通知。

具体的做法是在建好一个套接字后,调用WSAAsyncSelect函数。

该模型最早出现于Winsock的1.1版本中,用于帮助应用程序开发者面向一些早期的16位Windows平台(如Windows for Workgroups),适应其“落后”的多任务消息环境。

应用程序仍可从这种模型中得到好处,特别是它们用一个标准的Windows例程(常称为"WndProc"),对窗口消息进行管理的时候。

WSAAsyncSelect是简单的一种WinsockI/O模型(之所以说它简单是因为一个主线程就搞定了)。

这里,我们需要做的是:

1.在WM_CREATE消息处理函数中,初始化WindowsSocketlibrary,创建监听套接字,绑定,监听,并且调用WSAAsyncSelect函数表示我们关心在监听套接字上发生的FD_ACCEPT事件;

2.自定义一个消息WM_SOCKET,一旦在我们所关心的套接字(监听套接字和客户端套接字)上发生了某个事件,系统就会调用WndProc并且message参数被设置为WM_SOCKET;

3.在WM_SOCKET的消息处理函数中,分别对FD_ACCEPT、FD_READ和FD_CLOSE事件进行处理;

4.在窗口销毁消息(WM_DESTROY)的处理函数中,我们关闭监听套接字,清除WindowsSocketlibrary

以下为各种I/O模型的介绍与WSAAsyncSelect模型原理图

 

I/O模型

WSAAsyncSelect模型原理图

程序设计流程图:

①对流程图进行解析:

首先,我们得用描述主窗口的参数填充WNDCLASSEX结构,注册窗口类,之后便是创建主窗口,将主窗口显示出来(出错与否),然后创建套接字,WSAAsyncSelect,绑定套接字到本地机器,指定监听的端口号,创建监听套接字,进入监听模式,最后消息循环,退出系统。

②代码及说明

#include"../common/initsock.h"

#include

#defineWM_SOCKETWM_USER+101//自定义消息

CInitSocktheSock;

 

LRESULTCALLBACKWindowProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);

intmain()

{

charszClassName[]="MainWClass";

WNDCLASSEXwndclass;

//用描述主窗口的参数填充WNDCLASSEX结构

wndclass.cbSize=sizeof(wndclass);

wndclass.style=CS_HREDRAW|CS_VREDRAW;

wndclass.lpfnWndProc=WindowProc;

wndclass.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;

wndclass.hIconSm=NULL;

:

:

RegisterClassEx(&wndclass);

//创建主窗口

HWNDhWnd=:

:

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;

}

USHORTnPort=4567;//此服务器监听的端口号

注:

此处4567为编写时端口,调试时用42247,42503两个端口测试。

//创建监听套节字

SOCKETsListen=:

:

socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

sockaddr_insin;

sin.sin_family=AF_INET;

sin.sin_port=htons(nPort);

sin.sin_addr.S_un.S_addr=INADDR_ANY;

//绑定套节字到本地机器

if(:

:

bind(sListen,(sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR)

{

printf("Failedbind()\n");

return-1;

}

//将套接字设为窗口通知消息类型。

:

:

WSAAsyncSelect(sListen,hWnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE);

//进入监听模式

:

:

listen(sListen,5);

//从消息队列中取出消息

MSGmsg;

while(:

:

GetMessage(&msg,NULL,0,0))

{

//转化键盘消息

:

:

TranslateMessage(&msg);

//将消息发送到相应的窗口函数

:

:

DispatchMessage(&msg);

}

//当GetMessage返回0时程序结束

returnmsg.wParam;

}

 

LRESULTCALLBACKWindowProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)

{

switch(uMsg)

{

caseWM_SOCKET:

{

//取得有事件发生的套节字句柄

SOCKETs=wParam;

//查看是否出错

if(WSAGETSELECTERROR(lParam))

{

:

:

closesocket(s);

return0;

}

//处理发生的事件

switch(WSAGETSELECTEVENT(lParam))

{

caseFD_ACCEPT:

//监听中的套接字检测到有连接进入

{

SOCKETclient=:

:

accept(s,NULL,NULL);

:

:

WSAAsyncSelect(client,hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);

}

break;

caseFD_WRITE:

{

}

break;

caseFD_READ:

{

charszText[1024]={0};

if(:

:

recv(s,szText,1024,0)==-1)

:

:

closesocket(s);

else

printf("接收数据:

%s",szText);

}

break;

caseFD_CLOSE:

{

:

:

closesocket(s);

}

break;

}

}

return0;

caseWM_DESTROY:

:

:

PostQuitMessage(0);

return0;

}

//将我们不处理的消息交给系统做默认处理

return:

:

DefWindowProc(hWnd,uMsg,wParam,lParam);

}

五.调试结果

运行调试截图

 

六.改进意见与心得体会

通过此次实验,我们掌握了winsock提供了WSAASYNselect异步I/O模型,利用这个模型,应用程序可在一个套接字上,接收以windows消息为基础的网络事件通知。

WASSsyncSelect模型的特点是将套接字绑定到窗口句柄,将网络事件与windows消息相关联。

当套接字有网络事件发生时,将网络事件以windows消息的形式派发给绑定的窗口,然后在窗口函数windowProc中处理windows消息(即网络事件)。

本次实验中,我们通过一步步的实验,调试,发现问题,查找资料,发现错误,调试改进,直到最后完成整个实验,从实验中巩固学习到的知识,并将它适当运用,达成目标。

在老师的细心指导下,与同学的配合联机调试下,此次实验,圆满完成,收益良多。

七.主要参考资料

《网络应用与开发》P825.2.2

《网络应用与开发》实验指导书实验4、5

《第六讲异步-网络通信中的I/O操作》

八.教师评语

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2