Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Установить timeout на соединение сокета (WinSock) 
:(
    Опции темы
Ibragim
Дата 29.1.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Всем день добрый.
Столкнулся с таким вопросом:
Используется неблокирующий сокет из юнита 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.


PM MAIL   Вверх
Qu1nt
Дата 29.1.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 2
Всего: 50



Можно его сначала пропинговать, например.
PM MAIL   Вверх
MaXL
Дата 29.1.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



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


--------------------
MaXL
PM MAIL   Вверх
MetalFan
Дата 29.1.2008, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



в инди это реализовано с пом.доп. потока, который закрывает сокет по истечению таймаута


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ibragim
Дата 29.1.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



да немало, но счас вроде сделал так:

Код

      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 Тогда уже не поток, а просто неблокирующий сокет и подождать в цикле...

Это сообщение отредактировал(а) Ibragim - 29.1.2008, 22:06
PM MAIL   Вверх
MetalFan
Дата 29.1.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



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

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

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

тоже вариант


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ibragim
Дата 29.1.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Цитата

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


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

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

Это сообщение отредактировал(а) Ibragim - 29.1.2008, 22:29
PM MAIL   Вверх
mrbrooks
Дата 29.1.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Можно использовать: 
WaitForSingleObject - для одного объекта
или
WaitForMultipleObjects - собственно для множества. 

PM MAIL   Вверх
Ibragim
Дата 29.1.2008, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



2mrbrooks: эм... и как же?

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

Это сообщение отредактировал(а) Ibragim - 29.1.2008, 22:37
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0783 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.