套接字I/O模型
1:Select模型
Select模型是一種常見的模型,通過select函數來確定套接字狀態。在網絡應用程序中,通過一個線程來設計一個循環,不停的調用select函數,判斷套接字上是否存在數據或者是否能夠向套接字寫入數據等
int select(int nfds,fd_set FAR *readfds, fd_set FAR *writefds,fd_set FAR * exceptfds, const struct timeval FAR * timeout)
nfds:無實際意義
readfds表示一組可讀套接字
writefds表示一組可寫套接字
exceptfds表示一組被檢查有錯誤的套接字
timeout表示函數的等待時間
返回值:如果函數調用成功,在readfds,writefds、exceptfds參數中將存儲滿足條件的套接字元素,並且函數返回值爲滿足條件的套接字數量。如果函數調用超出了timeout設置的時間,返回值是0,如果函數調用失敗,返回值是SOCKET_ERROR
爲了方便用戶對fd_set類型的參數進行操作,VC++提供了四個宏
1:FD_CLR(s, *set) :從集合中刪除套接字
2:FD_ISSET(s,*set):判斷套接字s是否爲集合set中的一員,如果是返回值爲0,否則爲0
3:FD_SET(s,*set):向集合中添加套接字s
4:FD_ZERO(*set):將集合set初始化爲null;
下面一段代碼判斷套接字上是否有數據可讀
fd_set fdRead; //定義一個fd_set對象
FD_ZERO(&fdRead); //初始化fdRead
FD_SET(clientSock,&fdRead); //將套接字clientSock添加到fdRead中
if(select(0,&fdRead,NULL,NULL,NULL)>0) //調用select函數
{
If(FD_ISSET(clientSock,&fdRead)//判斷clientSock是否是fdRead中一員
{
//從套接字中讀取數據
}
}
2:WSAAsyncSelect模型
WSAAsyncSelect模型是WINSOWS系統基於消息的網絡事件通知模型。當網絡中有事件發生時,利用用戶的連續請求,則應用程序中指定的窗口將會接受到一個消息,可以通過處理消息函數對網絡中的事件進行處理。
int WSAAsyncSelect(SOCKET s,HWND hwnd,unsigned int wMsg,long lEvent)
Hwnd:表示接收消息的窗口句柄
wMsg表示窗口接受來自套接字中的消息
lEvent表示網絡中發生的事
其中對於lEvent事件有
FD_READ :套接字中有數據讀取時發送消息
FD_WRITE:當輸出緩衝區可用區時發出消息
FD_OOB:套接字中有外帶數據讀取時發生消息
FD_ACCEPT:有連接請求時發出消息
FD_CONNECT:當連接完成後發出消息
FD_CLOSE:套接字關閉時發出消息
下面通過一段代碼描述WSAAsyncSelect模型的使用
1:自定義一個消息
#define WM_SOCKER WM_USER+20
2:添加一個消息處理函數,用於處理網絡中的事件
LRESULT CDialogDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{
int nEvent=WSAGETSELECTEVENT(lParam);//讀取網絡18:40
int nError=WSAGETSELECTERROR(lParam);//讀取錯誤代碼
switch(nEvent)
{
case FD_CONNECT:……
case FD_READ :……
……
}
Return 0;
}
3:添加消息映射宏,將自定義消息與消息處理函數關聯
ON_MESSAGE(WM_SOCKET,OnSocket)
4:調用WSAAsyncSelect函數套接字模型
int nRet=WSAAsyncSelect(clientSock,m_hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CONNECT);
if(nRet!=0)
{
TRACE(“設置WSAAsyncSelect模型失敗”);
}