1.基于windows消息为基础的网络事件io模型。因此我们必须要在窗口程序中使用该模型。该模型中的核心是调用WSAAsyncSelect函数实现异步I/O。

2.WSAAsyncSelect函数:注册网络事件函数
int WSAAsyncSelect(
    SOCKET s,//
    HWND hWnd,//
    unsigned int wMsg,//注意,该消息值应该大于WM_USER(1024)
    long lEvent,//网络事件
    );
若应用程序针对一个套接字调用了WSAAsyncSelect,那么套接字的模式会从阻塞自动变成非阻塞,这样一来,假如调用了像WSARecv这样的Winsock I/O函数,但当时却并没有数据可用,那么必然会造成调用的失败,并返回WSAEWOULDBLOCK错误。为防止这一点,应用程序应依赖于由WSAAsyncSelect的uMsg参数指定的用户自定义窗口消息,来判断网络事件类型何时在套接字上发生;而不应盲目地进行调用。

3.网络事件:
(1)FD_READ:读数据
(2)FD_WRITE:写数据
(3)FD_ACCEPT:接收连接
(4)FD_CONNECT:连接
(5)FD_CLOSE:关闭
各个事件可以进行或运算。特别要注意的是,多个事件务必在套接字上一次注册!另外还要注意的是,一旦在某个套接字上允许了事件通知,那么以后除非明确调用closesocket命令,或者由应用程序针对那个套接字调用了WSAAsyncSelect,从而更改了注册套接字的网络事件类型,否则的话,事件通知会永远有效!若将lEvent参数设为0,效果相当于停止在套接字上进行的所有网络事件通知。

4.在异步选择模型中,还需要自定义窗口消息处理函数。来对各种网络事件进行处理。该函数定义和win32窗口中的窗口消息处理函数相同。原型如下:
LRESULT CALLBACK WindowProc(
    HWND hWnd,//
    UINT uMsg,//
    WPARAM wParam,//
    LPARAM lParam
    )
参数lParam的低字(低位字)指定了已经发生的网络事件,而lParam的高字(高位字)包含了可能出现的任何错误代码。
网络事件消息抵达一个窗口例程后,应用程序首先应检查lParam的高字位,以判断是否在套接字上发生了一个网络错误。这里有一个特殊的宏WSAGETSELECTERROR,可用它返回高字位包含的错误信息。若套接字上没有产生任何错误,接着便应判断到底是哪个网络事件发生。具体的做法便是读取lParam低字节的内容。此时可使用另一个特殊的宏:WSAGETSELECTEVENT,用它返回lParam低字节的内容。

5.最后一个特别有价值的问题是应用程序如何对FD_WRITE事件进行处理。只有在三
种条件下,才会发出FD_WRITE通知:
(1)使用connect或WSAConnect,一个套接字首次建立了连接。
(2)使用accept或WSAAccept,套接字被接受以后。
(3)若send、WSASend、sendto或WSASendto操作失败,返回了WSAWOULDBLOCK错误,而且缓冲区的空间变得可用
因此,作为一个应用程序,自收到首条FD_WRITE消息开始,便应认为自己必然能在一个套接字上发出数据,直至一个send、WSASend、sendto或WSASendto返回套接字错误WSAWOULDBLOCK。经过了这样的失败以后,要再用另一条FD_WRITE通知应用程序再次发送数据。

示例代码:

 1 #define WM_SOCKET WM_USER+1
 2 #include<Windows.h>
 3
 4 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
 5 {
 6     //初始化
 7      SOCKET listen;
 8     HWND window;
 9     window=CreateWindow(...);//这一步并没有多大必要
10
11     WSAStartUp(...);
12     listen=socket(...);
13
14     //绑定地址
15     ...
16
17
18     //注册网络事件
19     WSAAsyncSelect(listen,window,WM_SOCKET,FD_ACCEPT|FD_CLOSE);
20
21     //转发消息
22     SendMessage(...);
23
24 }
25
26 //窗口消息处理函数
27 BOOL CALLBACK ServerWinProc(HWND hWnd,WORD wMsg,WPARAM wParam,LPARAM lParam)
28 {
29     SOCKET Accept;
30
31     case WM_PAINT:
32         ..
33         break;
34     case WM_SOCKET:
35         if(WSAGETSELECTERROR(lParam))
36         {
37             ...
38             closesocket(Accept);
39             break;
40         }
41         if(WSAGETSELECTEVENT(lParam))
42         {
43             case FD_ACCEPT:
44                 ...
45                 break;
46             case FD_CLOSE:
47                 ...
48                 break;
49             case ...
50         }
51 }

View Code

转载于:https://www.cnblogs.com/HPAHPA/p/7818836.html

二.Windows I/O模型之异步选择(WSAAsyncSelect)模型相关推荐

  1. 【网络编程】之八、异步选择WSAAsyncSelect

    大家用这个模型,可以让应用程序在一个套接字上接收以windows消息为基础的网络事件通知.我们想要用这个操作,具体的做法就是我们建立一个套接字,然后调用WSAAsyncSelect函数, 也就是说,这 ...

  2. 异步选择WSAAsyncSelect

    大家用这个模型,可以让应用程序在一个套接字上接收以windows消息为基础的网络事件通知.我们想要用这个操作,具体的做法就是我们建立一个套接字,然后调用WSAAsyncSelect函数, 也就是说,这 ...

  3. TCP/IP网络模型之异步选择模型

    异步选择模型是基于窗口实现 窗口的创建如下: 1.创建窗口结构体 typedef struct tagWNDCLASSEXW {UINT cbSize;UINT style;WNDPROC lpfnW ...

  4. 机器学习笔记(二)模型评估与选择

    2.模型评估与选择 2.1经验误差和过拟合 不同学习算法及其不同参数产生的不同模型,涉及到模型选择的问题,关系到两个指标性,就是经验误差和过拟合. 1)经验误差 错误率(errorrate):分类错误 ...

  5. 非期望产出的sbm模型_线性模型 vs. Logistic模型——离散选择模型之二

    前言:为什么因变量是分类变量的时候,我们会选择Logistic模型.而非最常见的线性回归模型?或者,换个说法:线性回归模型的劣势是什么?Logistic模型的优势又是什么?--针对这些问题,本文为您详 ...

  6. 效用最大化准则:离散选择模型的核心(二项Logit模型)——离散选择模型之九

    效用最大化准则:离散选择模型的核心(二项Logit模型)--离散选择模型之九 (qq.com)

  7. 西瓜书~至臻笔记(二)——模型评估与选择(可直接享用)

    文章目录 第二章 模型评估与选择 2.1 经验误差与过拟合 2.2 评估方法 2.2.1 留出法 分层采样 数据集中样本的顺序 数据集的大小比例 2.2.2 交叉验证法 数据集的样本顺序 留一法 2. ...

  8. 机器学习(学习笔记)二 模型评估与选择(上)

    模型评估与选择(上) 先画思维导图 一.经验误差与过拟合 误差:模型对样本的预测结果和样本的真实输出的差异称为 误差.给定一个数据集,将其分割为训练集和测试集 训练误差 (Training Error ...

  9. 面试必会系列 - 5.1 网络BIO、NIO、epoll,同步/异步模型、阻塞/非阻塞模型,你能分清吗?

    本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...

最新文章

  1. java使用localstorage_sessionStorage和localStorage的使用
  2. 最长非下降子序列(O(nlogn))(offer收割)
  3. python编的游戏越玩越卡_用Python写游戏,不到十分钟就学会了
  4. linux内核那些事之物理内存模型之DISCONTIGMEM(2)
  5. 通过少儿英语入门孩子的自信更多
  6. 树莓派Raspberry Pi OS开机自启动脚本
  7. Spring学习之旅(二):Bean的高级装配之解决装配歧义性
  8. ecshop getRow getAll getOne 返回值的区别
  9. Qt信号与槽机制详解
  10. android布局文件放在哪,Android开发之布局文件layout目录分包处理
  11. 使用vue-ui可视化管理工具来创建项目并安装vue-cli-plugin-element插件
  12. Oracle Wallet Manager
  13. 笨方法刷博客_C实现
  14. 旷视face++WebAPI接口调用
  15. 七大设计原则之接口隔离原则应用
  16. 关于c语言如何判断日期是否合法?\\有这样的日期吗?
  17. 关于期刊审稿与同行评审,论文“不为所知”的拒稿秘密在这里
  18. 2021职业院校新一代信息技术专业群1+X职业技能等级证书汇总
  19. 用excel做anova分析
  20. 川大研究生计算机网络挂科,四川大学200多名研究生被清退,让人倍感惋惜,原因几乎相同!...

热门文章

  1. python绘制彩色地震剖面_在地图上绘制饼图时“爆炸”楔形图(Python,matplotlib)...
  2. java递归查询无限极分类_sqlserver实现树形结构递归查询(无限极分类)的方法
  3. 渗透测试流程信息收集
  4. Vue-CLI and Leaflet (9): 点聚合 Leaflet.markercluster
  5. 金三银四的面试黄金季节,Android面试题来了!
  6. cron计划任务、权限和归属 、 使用LDAP认证 、 家目录漫游
  7. 【python】IP地址处理模块IPy
  8. struts Caused by: no protocol dtd - Class: java.net.URL
  9. nodejs学习笔记-用http模块开启服务器端口
  10. aehyok.com的成长之路一——开篇