![]() |
сокеты: таймаут при соеденении
Кто нибудь скажет как задать таймаут на соединение сокета?
|
Ну а на чем ты пишеш то ?
вобщем скажу на Perl это Timeout => **, |
Pirog
winapi под дельфей, то бишь вопрос по винсоку.. зы: в принципе соеденение в отдельном потоке создается, так что можно поток по таймауту грохать, но мне кажется, что есть более удачное решение... |
mozarttt
В хелпе msdn я не нашел установки таймаута для сокета. В ф-ции SetSocketOption можно поставить timeout Send'a и Receive'a, а Connection'a нету... :( |
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; |
mozarttt
Тоже вариант. А чем тебе вторые сокеты не нравятся? Планируешь прогу запускать под win3.11 или win95 не osr2? |
BigFoot
всем нравится. Это я написал для тех кто сам не впетрит откуда такие функции берутся |
| Часовой пояс GMT +4, время: 16:30. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.