1. 程式人生 > >WinSock---WSAAsyncSelect IO模型和select模型的比較

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

關於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模型 可以不非同步吧,但是他能這樣就沒必要用他了。。。