zoukankan      html  css  js  c++  java
  • Winsock异步模型之(事件通知模型 WSAAsyncSelect)

    1.  WSAAsyncSelect 使用此模型,应用程序可在一个套接字上进行以windows消息为基础的网络事件通知,此模型提供了读写数据能力的异步通知,但不提供异步数据传送。异步数据传送有“重叠及完成端口模型提供”。

      int WSAAsyncSelect (  
        SOCKET s,    //要进行操作的SOCKET
         HWND hWnd,  //要绑写的窗口句柄(当事件发生后要接收消息的窗口)
        unsigned int wMsg, //网络事件发生时的的消息响应
    long lEvent  //感兴趣的网络事件,请查阅MSDN
    );

    使用方法可分为:

    {1}初始化套接字相关信息:

     (2) 开始启动一个事件通知。WSAAsyncSelect(Sock, hWnd, 自定义消息, 网络事件)

    (3) 响应窗口的自定义消息处理函数, 其中lparam的高位字包含了可能出现的错误

    代码,低字节表示发生的网络事件。wParam表示发生网络事件的套接字。

    WSAGETSELECTERROR(lParam);  //查看是否出现错误,获取低字节位

    WSAGETSELECTEVENT(lParam);  //查看发生了什么事件,获取高字节位

    事件种类请查看MSDN,可用WSAGetLastError()来获取错误信息。

    注意:多个事件务必在套接字上一次完成注册。

         一旦在某个套接字上启用了事件通知,注册过的事件将一直有效,除非明确调用closesocket命令,或针对这个套接字再调用WSAAsyncSelect更改注册过的网络事件。

    优点:可在系统开销不大的情况下同时处理许多连接。

    缺点:即使用不需要窗口(如服务器,控制台)它也不得不额外使用一个窗口。同时如果处理成千上万套接字的所有事件,性能可想而知。

    MFCCSocket所使用的正是这种事件通知模型

    如自定的消息响应函数为;响应的事件为FD_ACCEPT

    OnSockAccept(WPARAM wParam, LPARAM lParam)

    {

        If (WSAGETSELECTERROR(lParam) )

          {

                //有错误发生,可用WSAGetLastError获取错误

    }

    SOCKET Accept;

    Accept = accept ( (SOCKET)wParam, NULL, NULL);

    //接下来可再注册相应的事件通知

    WSAAsyncSelect( Accept, 窗口句柄, 自定义的消息响应, 网络事件FD_READ |

    FD_CLOSE或其它);

    }

    如果有服务器端,则在创建并绑定套接字之后,监听开始之前就须开始事件通知

    其它socket模型待续...

     

     

     

  • 相关阅读:
    javascript的this
    javascript里的prototype
    【每天进步一点点 Python 】Python 字典(Dictionary) items()方法 用法
    【每天进步一点点--Python】字典dic类型 转换成 str 类型 json.dumps()
    【每天进步一点点
    【每天get 一点新知识】Python print 打印结果(字符串类型)前面添加 说明
    【每天get 到一点小知识】python 取response data 里面的数据
    【python web 开发】第三方登录开发模式及Oauth2.0 简介
    每天一个小程序:读取txt文件存储到excel 表中(2)
    每天一个小程序:读取txt文件存储到excel 表中
  • 原文地址:https://www.cnblogs.com/tyjsjl/p/2156138.html
Copyright © 2011-2022 走看看