套接字模型

 

            套接字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模型失敗”);

   }

     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章