WSAAsyncSelect Model

WSAAsyncSelect

  • WSAAsyncSelect模型允许应用程序以windows消息形式接受网络事件,这个模型是为了适应windows消息驱动环境而设置的,现在许多对性能要求不高的网络应用程序都采用了WSAAsyncSelect模型
  • WSAAsyncSelect函数自动将套接字设置为非阻塞模式,并且为套接字绑定一个窗口句柄,当有网络事件发生时,便向这个窗口发送消息
int WSAAsyncSelect(
SOCKET s,//需要设置套接字句柄
HWND hWnd,//指定一个窗口句柄,套接字的通知消息被发送到对应的窗口过程
u_int wMsg,//网络事件来到时接收到的消息ID,可以在WM_USER以上的数值中任意选择一个用作ID
long IEvent //指定哪些通知码需要发送
)
  • 最后一个参数IEvent指定了要发送的通知码,可以是如下取值的组合
    • FD_READ:套接字接收到对方的数据包,表明这时候可以去读套接字了
    • FD_WRITE:数据缓冲区满后再次变空时,WinSock接口通过该通知码通知应用程序,可以继续发送数据了
    • FD_ACCEPT:监听套接字检查到有新连接接入
    • FD_CONNECT:如果用套接字去连接对方的主机,当连接动作完成后会收到这个通知码
    • fd_close:检测套接字对应的连接被关闭

函数

::WSAAsyncSelect(sListen,hWnd,WM_SOCKET,FD_ACCEPT|FD_SLOSE);//WM_SOCKET为自定义消息
  • 上述代码将套接字sListen设为窗口通知消息类型

  • WM_SCKET为自定义网络通知消息

  • FD_CLOSE|FD_ACCEPT指定了sListen套接字只接收FD_CLOSE和FD_ACCEPT通知消息

  • 当有客户连接或者套接字关闭时,Winsock接口将指定的窗口发送WM_SOCKET消息

  • 成功调用WSAAsyncSelect之后,应用程序便开始以windows消息的形式在窗口函数接收网络事件通知

LRESULT CALLBACK WindowsProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  • wParam指定发生网络事件套接字句柄
  • lParam参数的低字位指定了发生的网络事件
  • 高字位包含了可能出现的错误代码
  • 可以使用宏WSAGETSELECTERROR和WSAGETSELECTEVENT将这些信息取出,这两个宏定义在Winsock2.h中
#define WSAGETSELECTERROR(LpARAM) hiword(lParam)//高字为出错代码
#define WSAGETSELECTEVENT(LpARAM) loword(LpARAM)//低字为通知码
  • 如果没有错误发生,出错代码为0,程序可以继续检查通知码,以确定发生网络事件。
  • 网络事件消息抵达消息处理函数后,应用程序首先检查lParam参数的高位,以判断释放在套接字上发生了网络错误。WSAGETSELECTERROR返回高字节的错误信息,若应用程序发现套接字上没有任何错误便可以使用宏WSAGETSELECTEVENT读取lParam参数低字位确定发生的网络事件
  • WSAAsyncSelect模型最突出的特点是与windows的消息驱动级制融合在一起了,这使得在开发带有GUI界面的程序变得非常简单,但是如果连接增加,单个windows函数处理上千个客户请求时,服务器性能势必收到影响。
  • demo链接:https://github.com/MikotoMisakas/Network_programming/blob/develop/WSAAsyncSelect_Model/WSAAsyncSelect_Model/WSAAyncSelect_Model.cpp
posted @ 2020-08-11 16:58  一生热爱  阅读(100)  评论(0编辑  收藏  举报