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
  • 相关阅读:
    CentOS虚拟机和物理机共享文件夹实现
    集训第六周 数学概念与方法 概率 数论 最大公约数 G题
    集训第六周 数学概念与方法 概率 F题
    集训第六周 E题
    集训第六周 古典概型 期望 D题 Discovering Gold 期望
    集训第六周 古典概型 期望 C题
    集训第六周 数学概念与方法 UVA 11181 条件概率
    集训第六周 数学概念与方法 UVA 11722 几何概型
    DAG模型(矩形嵌套)
    集训第五周 动态规划 K题 背包
  • 原文地址:https://www.cnblogs.com/binarysystemloophole/p/13476747.html
Copyright © 2011-2022 走看看