zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    php数组转换成js可用的数组的两种方式
    常用正则表达式--------------[拿把小刀,强大自己]
    AngularJs 相应回车事件
    常见的关系型数据库和非关系型数据库及其区别
    CMDB资产采集
    GB和GiB的区别
    python枚举详解
    python保留两位小数
    详解TCP三握四挥
    npm run dev 和 npm run serve
  • 原文地址:https://www.cnblogs.com/binarysystemloophole/p/13476747.html
Copyright © 2011-2022 走看看