热门标签 | 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宏来了解所发生的网络事件,从而进行相应处理。

 


推荐阅读
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 在探讨C语言编程文本编辑器的最佳选择与专业推荐时,本文将引导读者构建一个基础的文本编辑器程序。该程序不仅能够打开并显示文本文件的内容及其路径,还集成了菜单和工具栏功能,为用户提供更加便捷的操作体验。通过本案例的学习,读者可以深入了解文本编辑器的核心实现机制。 ... [详细]
  • 译文:如何使用SocketAsyncEventArgs类(How to use the SocketAsyncEventArgs class)
    转载自:http:blog.csdn.nethulihuiarticledetails3244520原文:HowtousetheSocketAsyncE ... [详细]
  • UML 包图
    什么是包包可直接理解为命名空间,文件夹,是用来组织图形的封装,包图可以用来表述功能组命名空间的组织层次。•在面向对象软件开发的视角中&#x ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 英语面试技巧:提升个人技能与表现
    在英语面试中,个人技能是指除专业知识外,能够促进职业发展的各种能力。虽然你可能具备多种技能,但建议重点突出与目标岗位最相关的几项,以增强面试官对你专业能力和适应性的认可。 ... [详细]
  • 浅析PHP中$_SERVER[
    在PHP后端开发中,`$_SERVER["HTTP_REFERER"]` 是一个非常有用的超级全局变量,它可以获取用户访问当前页面之前的URL。本文将详细介绍该变量的使用方法及其在不同场景下的应用,如页面跳转跟踪、安全验证和用户行为分析等。通过实例解析,帮助开发者更好地理解和利用这一功能。 ... [详细]
  • 在MFC开发过程中,利用Windows内置的文件对话框可以显著提高文件操作的效率。本文总结了使用文件对话框进行文件选择和处理的经验,详细介绍了相关API的调用方法和参数设置,如`CFileDialog`类的使用、结构体`OPENFILENAME`的配置以及如何获取选中的文件路径。通过这些技巧,开发者可以快速实现文件的打开、保存等功能,提升应用程序的用户体验。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
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社区 版权所有