1. 程式人生 > >配置 CSocket 操作的超時時間

配置 CSocket 操作的超時時間

摘要:

      CSocket 操作,如“接收”(Receive)、“傳送”(Send) 和“連線”(Connect) 均是阻塞操作,即要等到操作成功執行完畢或套接字上出現錯誤後,對這些函式的呼叫才有返回結果。 
      在某些情況下,操作可能永遠不能成功完成,這將導致程式無限迴圈等待操作完成。一種解決方法是通過程式設計限制完成操作使用的時間。本文將討論這種方法。

實現方法:

這種方法是設定定時,讓它在操作時間過長時啟動。此方法的關鍵在於處理定時器的方式。雖然操作是“阻塞的”,但仍然可以處理到達的訊息。如果通過使用 SetTimer 設定定時器,那麼可以查詢 WM_TIMER 訊息,並在收到該訊息時終止操作。該過程中涉及的主要函式有:

          Windows API 呼叫函式: ::SetTimer

MFC 函式: CSocket::OnMessagePending                   CSocket::CancelBlockingCall

為簡單起見,可以在 CSocket 衍生類中封裝該功能。
手寫如下函式:

BOOL SetTimeOut(UINT uTimeOut) 
呼叫此函式之後僅接著呼叫 CSocket 函式(如 Receive、Send 和 Accept)。uTimeOut 引數是以毫秒為單位指定的。之後,進行定時器的設定。如果設定定時器失敗,那麼函式返回 FALSE。

BOOL KillTimeOut()  

     在完成阻塞操作後,必須呼叫此函式。此函式刪除用 SetTimeOut 設定的定時器。如果呼叫 KillTimer 失敗,則返回 FALSE。

BOOL OnMessagePending()
     這是一個虛擬回撥函式,在等待操作完成時由 CSocket 類進行呼叫。此函式給您提供處理傳入訊息的機會。此實施過程檢查用 SetTimeOut 呼叫函式設定的定時器的 WM_TIMER 訊息。如果收到訊息,則呼叫 CancelBlockingCall 函式。有關 OnMessagePending 和 CancelBlockingCall 函式詳細的資訊,請參閱 MFC 文件。請注意:呼叫 CancelBlockingCall 函式 將導致操作失敗,而且 GetLastError 函式返回 WSAEINTR(表示操作中斷)。