热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

套接字I/O模型之消息机制WSAAsyncSelect

WSAAsyncSelect基于Windows消息机制异步IO模型,为特定网络事件指定系统通知信息.函数定义intWSAAsyncSelect(SOCKETs,HWNDhWnd,u

WSAAsyncSelect基于Windows消息机制异步I/O模型,为特定网络事件指定系统通知信息.

函数定义

int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent);

(1)参数4-1Event:设定用户关心得套接口上的网络事件.形式如:1Event=FD_READ/FD_CLOSE.

网络I/O事件 简表

事件值                             含义                                  触发条件

FD_READ          套接口有可读消息通知                      recv,recvfrom,WSARecv或WSARecvFrom

FD_WRITE         套接口有可发消息通知                      send,sendto,WSASend或WSASendTo

FD_OOB           套件口有外带数据消息通知                recv,recvfrom,WSARecv或WSARecvFrom

FD_ACCEPT      套接口有链接请求消息通知                accept或WSAAccept(错误码不能WSATRY_AGAIN)

FD_CONNECT 希望得到connect或多点join操作完成信息通知     无

FD_CLOSE(面向连接) 套接口关闭消息通知                                  无

FD_QOS           套接口QOS状态发生变化消息通知      WSAIoctl(SIO_GET_QOS)

FD_GROUP_QOS 保留                                              Reserved

FD_ROUTING_INTERFACE_CHANGE                        

特定方向的路由接口发生改变消息通知。                      WSAIoctl(SIO_ROUTING_INTERFACE_CHANGE)

FD_ADDRESS_LIST_CHANGE

得到本地地址列表上套接口协议族发生改变通知。         WSAIoctl(SIO_ADDRESS_LIST_CHANGE)

(2)参数3-wMsg:为套接口事件设定1Event通知消息通常形式(WM_USER + n)

如 #define WM_USER_SERVER     WM_USER+1

(3)参数2-bWnd指定系统通知消息wMsg的窗口句柄.函数若调用成功,

WSAAsyncSelect返回0;否则返回SOCKET_ERROR,这时可用WSAGetLastError来获取错误码.

事实上,成功发送一次消息,通知机制会暂停工作直到有重新激活消息通知机制到来.才可重新激活事件.

水平触发:FD_READ,FD_OOB和FD_ACCEPT 即重新激活,需要引发消息发送的条件.

边缘触发:FD_QOS,FD_GROUP_QOS等.

同一接口多次调用WSAAsyncSelect函数,只有最后一次生效.

因此:

WSAAsyncSelect(s, m_hWnd, WM_USER_SERVER, FD_READ),加上

WSAAsyncSelect(s, m_hWnd, WM_USER_SERVER, FD_CLOSE) 并不等于

WSAAsyncSelect(s, m_hWnd, WM_USER_SERVER, FD_READ | FD_CLOSE)

取消套接口上的I/O事件消息通知:、

WSAAsyncSelect(s, hWnd, 0, 0)  //  把监听的消息清零

在MFC编程环境中,使用该消息处理函数

BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)

     //{{AFX_MSG_MAP(CXXXDlg)

     ........

     //}}AFX_MSG_MAP

     ON_MESSAGE(WM_USER_SERVER, OnServerMsg)

     ........

END_MESSAGE_MAP()

处理消息函数声明为:

afx_msg void OnSERVERMsg(WPARAM wparam,LPARAM lParam);

它定义为:

void CXXXDlg::OnServerMsg(WPARAM wParam,LPARAM lParam)

{

       SOCKET sock = (SOCKET) wParam;

       if(WSAGETSELECTERROR(lParam)){

             ErrorProcess();

             return;

}

switch(WSAGETSELECTEVENT(lParam)){

case FD_READ:

          ReadDate(sock);    // 读数据并进行相应处理

          break;

case FD_CLOSE:

          Finsish(sock);        //套接口关闭工作

          break;

default;

          break;

}

}

其中函数会接受到两个参数wParam 和 lParam。

其中 wParam参数 指明网络事件套接口,多个套接口指定同一个用户消息,那么就需要根据wParam判断到底是哪个套接口待处理。

lParam参数包含两信息:底字指定发生网络事件,高字包含可能出现错误带代码。

另外 OnServerMsg函数中出现两个宏定义

#define WSAGETSELECTERROR(lParam)     HIWORD(lParam)

#define WSAGETSELECTEVENT(lparam)     LOWORD(lParam)

一般来讲,当用户 收到第一个FD_WRITE用户消息时就可以向套接口写数据,直到碰到WSAEWOULBALOCK错误时才

等待下一次FD_WRITE通知消息。

总结:WSAAsynSelect在MFC中使用流程

(1)、使用#define语句定义套接口网络事件设置用户消息值,一般为WM_USER+N形式。

(2)、调用WSAAsynsSelect函数,为套接口设定"网络事件-用户消息-消息接收窗体"的对应关系。

(3)、在消息接收窗体的代码的消息映射模块中,加入ON_MESSAGE宏,设定用户消息的处理函数。

(4)、编写用户处理函数,该函数应该首先使用WSAGETSELECTERROR宏判断是否有错误发生:

然后根据wParam值了解是哪一个套接口上发生了网络事件从而引起用户消息被发送:最后使用

WSAGETSELECTEVENT宏来了解所发生的网络事件,从而进行相应处理。

 


推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
author-avatar
沫cc乀纱蔓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有