2015年3月

Delphi Socket Connect Timeout 套字节链接超时设置

Function ConnectTimeOut(pAddr:PAnsiChar; uPort:Word; uTimeOut:Byte = 3):TSocket;
Var
  hSocket   :TSocket;
  Addr      :TSockAddrIn;
  uFalg     :u_long;
  WriteDset :TFDset;
  ExceptDset:TFDset;
  TimeVal   :TTimeVal;
begin
  Result               := INVALID_SOCKET;
  Addr.sin_family      := AF_INET;
  Addr.sin_port        := htons(uPort);
  Addr.sin_addr.s_addr := inet_addr(pAddr);
  if (Addr.sin_addr.s_addr = SOCKET_ERROR) then Exit;
  hSocket  := Winapi.WinSock.socket(AF_INET, SOCK_STREAM, 0);
  if hSocket = INVALID_SOCKET then Exit;
  
  uFalg  := 1;
  if ioctlsocket(hSocket, FIONBIO, uFalg) = NO_ERROR then 
  begin
    connect(hSocket, Addr, SizeOf(TSockAddrIn));
    uFalg := 0;
    if ioctlsocket(hSocket, FIONBIO, uFalg) = NO_ERROR then
    begin
      FD_ZERO(WriteDset);
      FD_ZERO(ExceptDset);
      FD_SET(hSocket, WriteDset);
      FD_SET(hSocket, ExceptDset);
      TimeVal.tv_sec  := uTimeOut;
      TimeVal.tv_usec := 0;
      select(0, nil, @WriteDset, @ExceptDset, @TimeVal);
      if (FD_ISSET(hSocket, WriteDset)) then
        Result := hSocket; 
        Exit;
    end;  
  end;  
  shutdown(hSocket, SD_BOTH);
  closesocket(hSocket); 
end;