Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Установить timeout на соединение сокета (WinSock)


Автор: Ibragim 29.1.2008, 15:29
Всем день добрый.
Столкнулся с таким вопросом:
Используется неблокирующий сокет из юнита WinSock, необходимо поставить таймаут на соединение.

То есть:
Код

var
  sc: TSocket;
begin
  <...>
  sc := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
  if (Connect(sc, Addr, SizeOf(Addr)) = Socket_Error) then <..>
  <..>


собственно задача: на строчке Connect происходит пауза, достаточно большая (точно не експериментировал), если сервер по адресу Addr не отвечает. А хотелось бы в любом случае ждать, положим, 2 секунды, и если не ответил, переходить по ветке then.


Автор: Qu1nt 29.1.2008, 17:37
Можно его сначала пропинговать, например.

Автор: MaXL 29.1.2008, 18:45
Пинг тоже занимает некоторое время, поэтому это скорее всего не подойдёт. Да и иногда пинг запрещён, а тут ситуация такая(как я понял) сервер включен, доступен, но не отвечает на соединение.
Ibragim, прямо таки много время тянет ?

Автор: MetalFan 29.1.2008, 21:52
в инди это реализовано с пом.доп. потока, который закрывает сокет по истечению таймаута

Автор: Ibragim 29.1.2008, 22:03
да немало, но счас вроде сделал так:

Код

      TimeOut := 2000;
      setsockopt(sc, SOL_SOCKET, SO_RCVTIMEO, @TimeOut, SizeOf(TimeOut));
      setsockopt(sc, SOL_SOCKET, SO_SNDTIMEO, @TimeOut, SizeOf(TimeOut));


и вроде как стало значительно беспроблемней. То есть все равно не 2 секунды, но рвет достаточно быстро...
Похоже что эти SO_RCVTIMEO, SO_SNDTIMEO имеют влияние и на запросы-"обмен приветствиями TCP"

В принципе оставим вопрос "полузакрытым" ( smile ) - если кто знает как это точно делается, буду благодарен, но в общем-то можно уже и так оставить.
Спасибо за ответы.

PS Естественно, создать еще поток - тоже вариант, но там могут быть серьезные подводные камни с утечкой памяти, а программа - это чекер IP (легальный! smile ) - у меня эти сокеты и так в 1000 потоков шуруют... В общем боюсь на каком-то ньюансе лажануться...

PPS Тогда уже не поток, а просто неблокирующий сокет и подождать в цикле...

Автор: MetalFan 29.1.2008, 22:22
Цитата(Ibragim @  29.1.2008,  22:03 Найти цитируемый пост)
у меня эти сокеты и так в 1000 потоков шуруют

жэсть.... а зачем так???

Добавлено через 29 секунд
Цитата(Ibragim @  29.1.2008,  22:03 Найти цитируемый пост)
PPS Тогда уже не поток, а просто неблокирующий сокет и подождать в цикле...

тоже вариант

Автор: Ibragim 29.1.2008, 22:28
Цитата

жэсть.... а зачем так???


скорость, %ля, меряем между подсетями smile 
весь интернет начальство замеряет, потом порежет и продасть smile 

PS Сорри за оффтоп, не удержался smile 
PPS Даже звонили куда-то в представительство, систему на серваке пропатчили чтобы оптимизированно тысячи соединений открывать smile 

Автор: mrbrooks 29.1.2008, 22:33
Можно использовать: 
WaitForSingleObject - для одного объекта
или
WaitForMultipleObjects - собственно для множества. 

Автор: Ibragim 29.1.2008, 22:36
2mrbrooks: эм... и как же?

Названные тобой функции как раз "замораживают" вызывающий их поток, то есть делают как раз противоположное тому, что мне надо. У меня и так поток, в котором идет соединение, "замораживается" на большее время (до того, как ОС решит что хватит ждать соединения), чем мне надо...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)