关于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模型 可以不异步吧,但是他能这样就没必要用他了。。。