|
BigFoot
я весь инет излазил, все пишут на connect() нельзя таймаут изменить (типа это жутко глобальный параметр), но нашел другое решение. Правда нужен винсок2:
var
WSAData: TWSAData;
FSocket: TSocket;
addr: TSockAddr;
hEvent: THandle;
fset: TFDSet;
tv: TTimeVal;
s, opt: Integer;
host: string;
port: Integer;
tmout: Integer;
begin
host := '127.0.0.1';
port := 21;
tmout := 3; // <<<---- вот он собака!
if WSAStartup(MAKEWORD(2, 0), WSAData) = 0 then
begin
addr.sin_family := AF_INET;
addr.sin_addr.S_addr := inet_addr(pchar(host));
addr.sin_port := htons(port);
hEvent := WSACreateEvent;
FSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if FSocket <> INVALID_SOCKET then
begin
WSAEventSelect(FSocket, hEvent, FD_WRITE + FD_CONNECT);
connect(FSocket, @addr, sizeof(addr));
if WSAGetLastError() <> WSAEINPROGRESS then
begin
FD_ZERO(fset);
FD_SET(FSocket, fset);
tv.tv_sec := tmout;
tv.tv_usec := 0;
select(1, nil, @fset, nil, @tv);
if FD_ISSET(FSocket, fset) then
begin
s := Sizeof(Opt);
opt := 1;
getsockopt(FSocket, SOL_SOCKET, SO_ERROR, @opt, s);
if opt = 0 then ....; //рулез - порт открыт!
end;
CloseSocket(FSocket);
end;
WSACloseEvent(hEvent);
end;
WSACleanup;
end;
end;
|