connect 、recv、send 超時解決方案

問題:經驗分享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;
  

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