WinSock---WSAAsyncSelect IO模型和select模型的比较

本文对比了WSAAsyncSelectIO模型和select模型。WSAAsyncSelectIO基于事件,通过注册事件来处理socket的IO操作;而select模型则需要手动管理socket集合,通过select函数来判断socket是否准备好进行读写操作。

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

 

关于WSAAsyncSelect IO模型和 select模型的比较。

个人认为一个是被动的,一个是被动的。

 

WSAAsyncSelect IO模型 是基于事件的。也就是说用 WINSOCK_API_LINKAGE int WSAAPI
WSAAsyncSelect(
    SOCKET s,
    HWND hWnd,
    u_int wMsg,
    long lEvent
    );函数去注册一个事件(估计在这个函数里开了线程,注意到 这里传的参数非常详细,有HWND,所以。。。。) ,然后单这个socket接到数据,或者有别的IO操作时,只要他注册了这个事件,就会向 hWnd发送消息(连带数据 一起发了), 然后在界面线程 接受到消息,进过消息路由,转到指定函数,就可以对这个socket进行处理了。比如这个消息处理函数是 OnSockMsg(WPARAM wParam,LPARAM lParam)

其中 wParam 就是当前socket了。lParam(LOWORD(lParam)) 的低位就是 所发生的事件类型了,通过这个可以指定对不通的事件做特定操作..

 

 

 

 

select 模型 就不同了,因为什么都要自己写,我觉的可以通过select 模仿  封装出 WSAAsyncSelect IO模型 。

 

这个编程模型中需要注意的是。他有一个fd_set结构,这个结构是用来包含 socket 的。当 调用 WSAAPI
select(
    int nfds,
    fd_set FAR * readfds,
    fd_set FAR * writefds,
    fd_set FAR *exceptfds,
    const struct timeval FAR * timeout
    );

 

将这个 集合传到相应的参数,

 

然后  select 函数 会判断是否可以进行相应的操作,如果可以就返回TRUE了。

 

哈哈,这里没有返回可以进行 相应操作的集合,呃,为什么呢,呵呵。

 

所以我们还要判断 想要操作的socket是否在这个集合中。这里用FD_ISSET(fd, set) 宏就可以了。

 

他会判断 socket是否在集合中,如果在,就可以用这个socket进行相应的操作了。

 

 

 

WSAAsyncSelect 模型  是一定要异步的,没的选。

 

select模型 可以不异步吧,但是他能这样就没必要用他了。。。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值