1. 程式人生 > >如何設定socket通訊的連線超時

如何設定socket通訊的連線超時

在建立socket連線時可以很容易設定socket通訊的傳送和接收超時時間,但是在建立socket通訊時,如果是Win98系統,則如果連線失敗,則程式會一直等待在哪裡,Windows2000預設超時時間是30秒,當然,這個超時時間不算長,但是加入我們要迴圈掃描一系列埠並且建立連線的話,總的等待時間就會讓人忍受不了,下面就以delphi為例進行說明,如何在建立socket的時候設定其超時時間:

  //連線,傳送和接收時間都設為2秒

  SctTimeOut := 2000;
  //設定接收資料通訊超時
  setsockopt(hSock,SOL_SOCKET,SO_RCVTIMEO,@SctTimeOut,SizeOf(Integer));
  //設定傳送資料通訊超時
  setsockopt(hSock,SOL_SOCKET,SO_SNDTIMEO,@SctTimeOut,SizeOf(Integer));

  //首先,設定通訊為非阻塞模式
  dwArg := 1;
  RecvLen := ioctlsocket(hSock,FIONBIO,dwArg);

  //其次,連線伺服器
  ZeroMemory(@addr, sizeof(addr));
  addr.sin_family := AF_INET;
  addr.sin_addr.S_addr := inet_addr(pchar(SvrIP));
  addr.sin_port := htons(Strtoint(SvrPort));
  RecvLen := 0;
  RecvLen := connect(hSock, addr, sizeof(addr));

  //再次,設定連線超時時間為2秒
  tmOut.tv_sec := 2;
  tmOut.tv_usec := 0;
  FD_ZERO(recvSet);
  FD_SET(hSock, recvSet);
 
  RecvLen := select(0, @recvSet, @recvSet, nil, @tmOut);

 //連線失敗,報錯誤資訊

   if (RecvLen = 0) or (RecvLen = SOCKET_ERROR) then
  begin
    ErrMsg := '連線伺服器失敗!';
    exit;
  end;

  //最後,設定通訊為阻塞模式
  dwArg := 0;
  RecvLen := ioctlsocket(hSock,FIONBIO,dwArg);
  //end modify