與Unix socket的最主要區別就是在最上面加了WSAStartup()函數,最後加了WSACleanup()函數。中間都是一樣的。
int WSAStartup(Word wversion, LPWSADATA lpWSAData)
第一個參數是版本,要求2.2 還是1.1.
函數成功以後,lpWSAData指向一個結構體,包括win sock的一些信息。
WSACleanup()函數用來釋放winsocket庫,這個函數之後,再調用任何socket函數,都會出錯。
2.2 WinSock
2.2.1 采用類似Unix的方法
使用ioctlsocket()把socket設置為無堵塞的。
使用select()多路傳輸多個套接字。
2.2.2 使用WSAAsyncSelect()函數
WSAAsynSelect()擴展了Unix的select()函數,它允許Windows進行查詢套接字的操作。創建的WSAAsynSelect()方法包括要監視的套接字和一個Windows消息值,當某個套接字出現的時候,該消息就會送到窗口。
int WSAAsynSelect(Socket s, HWND hwnd, unsigned int wMsg, long lEvent)
Event包括如下事件類型:
FD_ACCEPT 用套接字建立一個新的連接
FD_ADDRESS_LIST_CHANGE為套接字的協議族而改變的本地地址列表
FD_CLOSE 一個現有的連接被關閉
FD_CONNECT 已經完成與遠程主機連接的套接字
FD_GROUP_QOS 套接字組的QOS已經改變
FD_OOB 套接字受到帶外的數據
FD_QOS 套接字的QOS已經改變
FD_READ 套接字有准備讀的數據
FD_ROUTING_INTERFACE_CHANGE套接字的路由接口已經改變到一個特殊的目的地
FD_WRITE 套接字准備寫數據
Example:
WSAAsynSelect( sock, hwnd, WM_SOCKET, FD_READ | FD_CLOSE );
2.2.3 使用WSAEventSelect()函數
為了適應一些應用程序例如精靈程序或者某些沒有用戶界面的服務程序(因此不使用窗口句柄),Windows Socket 2提供了WSAEventSelect()函數和WSAEnumNetworkEvents()函數。WSAEventSelect()函數和WSAAyncSelect()函數很類似,區別僅在於當一個FD_XXX網絡事件發生時,WSAEventSelect()函數將導致一個應用程序指定的事件對象被設置,而WSAAyncSelect()將導致一條Windows消息被發送(例如FD_READ,FD_WRITE等等)。