Winsock异步事件通知模型WSAAsyncSelect

本文介绍了WSAAsyncSelect模型的使用方法及其优缺点。该模型允许应用程序通过Windows消息进行网络事件的通知,适用于处理大量连接的情况。文章详细解释了如何初始化套接字,并通过示例代码展示了如何响应特定的网络事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2007-03-23 22:01

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模型待续...

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值