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;