WSAASYNCSELECTIO模型的程序设计.docx
《WSAASYNCSELECTIO模型的程序设计.docx》由会员分享,可在线阅读,更多相关《WSAASYNCSELECTIO模型的程序设计.docx(11页珍藏版)》请在冰豆网上搜索。
![WSAASYNCSELECTIO模型的程序设计.docx](https://file1.bdocx.com/fileroot1/2023-1/25/51ed98ca-6764-40de-acac-48f102d12eaa/51ed98ca-6764-40de-acac-48f102d12eaa1.gif)
WSAASYNCSELECTIO模型的程序设计
WSAASYNCSELECT---IO-模型的程序设计
WSAASYNCSELECTI/O模型的程序设计
一.实验目的
通过本次实验,掌握winsock提供了WSAASYNselect异步I/O模型,利用这个模型,应用程序可在一个套接字上,接收以windows消息为基础的网络事件通知。
二.实验任务
根据实验的要求完成,先画出实验程序的整体框架的流程图,明确步骤后。
根据各步骤编写相应的程序,完成后,进行调试,修改,直至完成整个实验报告,最后撰写实验报告。
三.实验设计方案
在应用程序中,首先必须用CreateWindow函数创建一个窗口,再为该窗口提供一个窗口例程支持函数(winproc)。
应用程序在一个套接字上成功调用了WSAAsynselect之后,应用程序会在与hwnd窗口句柄参数对应的窗口例程中以windows消息形式,接受网络事件通知。
窗口例程windowPro的Wparam参数指定在其上面发生了一个网络事件的套接字。
1Param的低字(低位字)指定了已发生的网络事件,而1Param参数的高字(高位字)包含了可能出现的任何错误代码,可用两个特殊的宏去获取低位字,高位字的值。
四.算法,流程图及关键代码说明
异步复用I/O模型的说明:
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操作》
八.教师评语