imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 10.08.2003, 20:02     # 1
mozarttt
Junior Member
 
Аватар для mozarttt
 
Регистрация: 05.05.2003
Адрес: где то рядом
Сообщения: 120

mozarttt Путь к славе только начался
Question сокеты: таймаут при соеденении

Кто нибудь скажет как задать таймаут на соединение сокета?
mozarttt вне форума  
Старый 10.08.2003, 20:18     # 2
Pirog
Guest
 
Сообщения: n/a

Ну а на чем ты пишеш то ?
вобщем скажу на Perl это
Timeout => **,
 
Старый 10.08.2003, 20:23     # 3
mozarttt
Junior Member
 
Аватар для mozarttt
 
Регистрация: 05.05.2003
Адрес: где то рядом
Сообщения: 120

mozarttt Путь к славе только начался
Pirog
winapi под дельфей, то бишь вопрос по винсоку..

зы: в принципе соеденение в отдельном потоке создается, так что можно поток по таймауту грохать, но мне кажется, что есть более удачное решение...

Последний раз редактировалось mozarttt; 10.08.2003 в 20:27.
mozarttt вне форума  
Старый 14.08.2003, 17:26     # 4
BigFoot
Junior Member
 
Регистрация: 16.12.2002
Сообщения: 64

BigFoot Путь к славе только начался
mozarttt
В хелпе msdn я не нашел установки таймаута для сокета. В ф-ции SetSocketOption можно поставить timeout Send'a и Receive'a, а Connection'a нету...
BigFoot вне форума  
Старый 14.08.2003, 19:27     # 5
mozarttt
Junior Member
 
Аватар для mozarttt
 
Регистрация: 05.05.2003
Адрес: где то рядом
Сообщения: 120

mozarttt Путь к славе только начался
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 вне форума  
Старый 15.08.2003, 09:44     # 6
BigFoot
Junior Member
 
Регистрация: 16.12.2002
Сообщения: 64

BigFoot Путь к славе только начался
mozarttt
Тоже вариант. А чем тебе вторые сокеты не нравятся? Планируешь прогу запускать под win3.11 или win95 не osr2?
BigFoot вне форума  
Старый 17.08.2003, 04:51     # 7
mozarttt
Junior Member
 
Аватар для mozarttt
 
Регистрация: 05.05.2003
Адрес: где то рядом
Сообщения: 120

mozarttt Путь к славе только начался
BigFoot
всем нравится. Это я написал для тех кто сам не впетрит откуда такие функции берутся
mozarttt вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 16:34.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.