| imho.ws |
![]() |
|
|
|
# 3 |
|
Junior Member
Регистрация: 05.05.2003
Адрес: где то рядом
Сообщения: 120
![]() |
Pirog
winapi под дельфей, то бишь вопрос по винсоку.. зы: в принципе соеденение в отдельном потоке создается, так что можно поток по таймауту грохать, но мне кажется, что есть более удачное решение... Последний раз редактировалось mozarttt; 10.08.2003 в 20:27. |
|
|
|
|
# 5 |
|
Junior Member
Регистрация: 05.05.2003
Адрес: где то рядом
Сообщения: 120
![]() |
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; |
|
|