為csocket配置time-out功能
csocket操作,如send(),receive(),connect()都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。
在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功完成的時間是個好主意。本文就是討論此問題的。
乙個辦法是設計乙個計時器,當操作費時過長時就觸發。這個辦法的關鍵是怎樣處理計時器。雖然操作是阻塞的,但仍具處理傳回的訊息的能力。如果用settimer來設定計時器,就可截獲wm_timer訊息,當它產生時就終止操作。涉及到這個過程的主要函式是:windows api ::settimer(),mfc函式csocket::onmessagepending()和csocket:: cancelblockingcall()。這些功能可包裝到你的csocket類中得以簡化。
類中用到三個重要函式:
bool settimeout(uint utimeout) 它應在csocket函式呼叫前被呼叫。utimeout以千分秒為單位。下面的實現只是簡單的設定計時器。當設定計時器失敗時返回false。參見windows api中關於settimer的說明。
bool killtimeout() 此函式應在操作未完成被阻塞時被呼叫。它刪除settimeout所設定的計時器。如果呼叫killtimer失敗則返回false。參見windows api中關於killtimer的說明。
bool onmessagepending() 它是乙個虛擬**函式,當等待操作完成時被csocket類呼叫。它給你機會來處理傳回的訊息。這次我們用它來檢查settimeout所設定的計時器,如果超時(time-out),則它呼叫cancelblockingcall()。參見mfc文件關於onmessagepending()和cancelblockingcall()的說明。注意呼叫cancelblockingcall()將使當前操作失敗,getlasterror()函式返回wsaeintr(指出是中斷操作)。
下面就是使用這個類的例子:
... ctimeoutsocket sockserver; cacceptedsocket sockaccept; sockserver.create(777); sockserver.listen(); // note the following sequence: // settimeout // // killtimeout if(!sockserver.settimeout(10000)) if(!sockserver.accept(sockaccept)) if(!sockserver.killtimeout()) ...下面是示例**:
// // header file // class ctimeoutsocket : public csocket ; // // end of file // // // implementation file // bool ctimeoutsocket::onmessagepending() ; }; return csocket::onmessagepending(); } bool ctimeoutsocket::settimeout(uint utimeout) bool ctimeoutsocket::killtimeout()
為CSocket配置Time Out功能
不錯,搜到以下內容,很多 為csocket配置time out功能 csocket操作,如send receive connect 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功...
為CSocket配置Time Out功能
為csocket配置time out功能 csocket操作,如send receive connect 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功完成的時間是個好主意。本文...
為CSocket配置Time Out功能
為csocket配置time out功能 csocket操作,如send receive connect 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功完成的時間是個好主意。本文...