問題:經驗分享1: connect 、recv、send 超時解決方案 ( 積分:0, 回覆:19, 閱讀:756 ) 分類:Internet/TCPIP ( 版主:luyear, robertcool ) |
|
來自:leaber, 時間:2005-6-7 17:34:00, ID:3097068 | [顯示:小字體 | 大字體] |
好多朋友在問這個問題,希望我的文檔能對大家有所幫助~~!!
CONNECT 連接超時解決方案 和send recv 超時解決方案 leaber 2004-10-12整理測試 做網絡程序中會經常見到判斷CONNECT超時的問題,解決的思路是這樣的, 首先把要連接服務器的SOCKET轉換爲非阻塞方式後進行連接,然後利用 時間差值來判斷是否超時。 如果成功的話就把SOCKET再設爲阻塞方式,當然如果超時的話你就看着辦吧! 時間差值的計算方式有好多種,我的實現方式是以SELECT來實現的. ===============這裏是我成功測試的代碼========================== Skt := Socket(AF_INET, 1, 0); ca.sin_family := AF_INET; ca.sin_port := htons(80); FD_ZERO(fs); FD_SET(skt, fs); timeout.tv_sec := 10; timeout.tv_usec := 500; //在這裏完成CONNECT超時檢查的功能 ulB := 1; ioctlsocket(Skt, FIONBIO, ulB); if Connect(skt, ca, sizeof(ca)) = SOCKET_ERROR then begin if (WSAGetLastError() = WSAEWOULDBLOCK) then begin FD_ZERO(fs); FD_SET(skt, fs); rc := select(0, nil, @fs, nil, @Timeout); end; end; if rc = 0 then begin //ShowMessage('connect overtime!'); CloseSocket(skt); exit; end; ulB := 0; ioctlsocket(Skt, FIONBIO, ulB); //CONNECT 超時功能結束 通過SETSOCKOPT可以完成對RECV和SEND相應的超時設置! //完成SETSOCKOPT 進行相應的發送和接收的超時 timeout1 := 5000; if SetSockOpt(skt, SOL_SOCKET, SO_SNDTIMEO, pchar(@TimeOut1), SizeOf(TimeOut1)) <> 0 then Exit; if SetSockOpt(skt, SOL_SOCKET, SO_RCVTIMEO, pchar(@TimeOut1), SizeOf(TimeOut1)) <> 0 then Exit; |
connect 、recv、send 超時解決方案
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.