Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];

Вниз

Сокеты, таймаут   Найти похожие ветки 

 
Vitaliy ©   (2006-07-23 22:16) [0]

Подскажите пожалуйста, как изменить таймаут на функцию connect для TCP сокета. Дело в том, что если я пытаюсь соедениться к компьютеру на котором не установлен ServerSocket, то клиентский сокет блокируется на 21 секунду. Как уменьшить это время?
P.S. Использую стандартные сокеты (http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021)


 
Сергей М. ©   (2006-07-24 08:32) [1]


> Как уменьшить это время?


Никак.
Но проблема легко решается, например, при использовании неблокирующего режима.


 
Ketmar ©   (2006-07-24 21:24) [2]

>Сергей М. ©   (24.07.06 08:32) [1]
мучают подозрения, что "как" всё-таки есть. но доказать не могу. %-)


 
Сергей М. ©   (2006-07-25 08:13) [3]


> Ketmar ©   (24.07.06 21:24) [2]



> доказать не могу


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


 
Ketmar ©   (2006-07-25 13:27) [4]

>Сергей М. ©   (25.07.06 08:13) [3]
понятно, что от таймаута на получение пакета подтверждения (скорость линии в данном случае не рассматриваем). вот меня и мучают подозрения, что этот таймаут можно регулировать. на закрытие можно, это я использую. а на соединение как-то не приходилось, вот и теоризирую. %-)
точнее, жду, пока придёт кто-то знающий и снисходительно всё расскажет. %-)


 
Сергей М. ©   (2006-07-25 13:30) [5]

Ну, положим, в реестре есть некие соответствующие (по смыслу) параметры.

Но действуют они, imho, отнюдь не на конкретный connect(), а на интерфейс в целом ... с момента инициализации объект а, его предоставляющего, при старте системы как таковой.

Прикажешь реестр править ?)


 
Ketmar ©   (2006-07-25 16:23) [6]

>Сергей М. ©   (25.07.06 13:30) [5]
понятно, что в реестре много чего есть. но меня мучают смутные подозрения насчёт наличия возможности управления через WSAIoctl(). однако искать не пойду -- тогда интересный разговор закончится. %-)


 
Сергей М. ©   (2006-07-25 16:41) [7]


> Ketmar ©   (25.07.06 16:23) [6]


Э-э-э...

Вылупился я в кои-то веки, как баран на новые ворота, сюда:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsaioctl_2.asp

Куда уж, казалось бы, предметней будет ссылка насчет упомянутой тобой WSAIOctl() ..

Ввожу там, дуб я дубом, модель поиска "timeout" - и получаю полный отлуп. Ну нет, понимаешь ли, в описании сей ф-ции ни малейших намеков на тайм-ауты !
Мне что, в дурку пора ?)


 
Ketmar ©   (2006-07-25 18:28) [8]

>Сергей М. ©   (25.07.06 16:41) [7]
э-э-э... ну, я же не сказал, оно именно там. если бы я это точно знал -- я бы так и написал. а были только подозрения. "подозрение не есть уверенность, можно и ошибиться" (ц) в других функциях управления сокетами я тоже ничего не нашёл по этому поводу. но вот "нутром чую", что должно быть что-то. (прим.: этимологию слова "нутро" пояснить не могу)

зыж при помощи WSAIoctl() как минимум устанавливаются таймауты для keep-alive пакетов. что важно, ибо по умолчанию обрыв соединения регистрируется через совершенно неприличное время. %-)


 
Eraser ©   (2006-07-25 19:18) [9]

> [0] Vitaliy ©   (23.07.06 22:16)
> Подскажите пожалуйста, как изменить таймаут на функцию connect
> для TCP сокета. Дело в том, что если я пытаюсь соедениться
> к компьютеру на котором не установлен ServerSocket, то клиентский
> сокет блокируется на 21 секунду. Как уменьшить это время?

можно глянуть исходники Indy.. ведь там же как-то это реализовано..


 
Ketmar ©   (2006-07-26 00:08) [10]

>Eraser ©   (25.07.06 19:18) [9]
честно? просто не пользую индейцев. с ходу могу предположить, что там таки неблокирующий режим для этого используют. найду архив с индейцами -- гляну. %-)


 
Eraser ©   (2006-07-26 02:19) [11]

> [10] Ketmar ©   (26.07.06 00:08)


> честно?

угу )

> найду архив с индейцами -- гляну. %-)

я попробовал это сделать.. всмысле глянуть.. так и не хватило терпения докопаться до того места, где используется API )) намудрено у них там все ))


 
Сергей М. ©   (2006-07-26 08:45) [12]


> Vitaliy ©   (23.07.06 22:16)


Вот фрагмент справки к ф-ции select(), предусматривающей возможность задания таймаута ожидания событий:

The parameter writefds identifies those sockets which are to be checked for writability. If a socket is connecting (nonblocking), writability means that the connection establishment successfully completed


 
Ketmar ©   (2006-07-26 14:01) [13]

>Сергей М. ©   (26.07.06 08:45) [12]
select() -- это круто. только в блокирующем режиме connect() не вернёт управление, пока не соединится или не обломится. так что select() демократию не спасает.
как сделать через неблокирующий режим -- я знаю. мне с блокирующим интересно. %-)


 
umbra ©   (2006-07-26 17:37) [14]

в инди сам процесс коннекта происходит в отдельном потоке, а основной поток крутится в цикле, дожидаясь таймаута. Если таймаут наступил, а поток не завершился (соединение не установлено), то возбуждается EIdConnectTimeout. Вся эта кухня для инди 10 находится в модуле IdIOHandlerStack.pas в методе TIdIOHandlerStack.ConnectClient


 
Ketmar ©   (2006-07-26 19:10) [15]

>umbra ©   (26.07.06 17:37) [14]
ясно. благодарю за информацию. что-то вроде этого я и предполагал. %-(


 
Сергей М. ©   (2006-07-27 09:52) [16]


> Ketmar ©   (26.07.06 14:01) [13]
>
> >Сергей М. ©   (26.07.06 08:45) [12]
> select() -- это круто. только в блокирующем режиме connect()
> не вернёт управление


IMHO, ты свихнулся на этом блок.режиме)

Зачем усложнять решение задачи, если существует неблок. режим, с легкостью преодолевающий все видимые проблемы ?


 
Ketmar ©   (2006-07-27 10:11) [17]

>Сергей М. ©   (27.07.06 09:52) [16]
таки да. это форма "бзика". %-) ну вот есть у меня резкая антипатия к неблокирующему. причём я уже и не помню, из-за чего она возникла. есть подозрения, что из-за моего в своё время неумения с ним толком работать.

к тому же блокирующий реально удобнее -- нет лишних проверок и асинхронных вызовов. меня всем устраивает, кроме  connect(). %-)

зыж глянул в свой старый софт. тоже работаю с блокирующим режимом, для проверок на отсутствие блоков в нужных метсах использую select(). извращенец? %-)


 
Сергей М. ©   (2006-07-27 10:19) [18]


> меня всем устраивает, кроме  connect()


Предлагаю разумный компромисс - connect() выполняй в неблок.режиме, а после установления коннекта продолжай работать так как тебе удобно, т.е. в блокирующем.

Ы ?


 
Ketmar ©   (2006-07-27 12:46) [19]

я, кстати, как раз об этом думал. только -- а резве можно сокет туда-сюда переводить после connect()? (это так, вопрос "в воздух", сам проверю, натурально %-).

однако странно, что для connect() не предусмотрено настроек. или предусмотрены, но я всё-таки куда-то не туда рою? это уже так, патологическая любознательность. %-)

зыж для себя-ненавистника удобств придумал вариант: делать connect() вообще в отдельном новом потоке. %-))


 
Сергей М. ©   (2006-07-27 13:01) [20]


> резве можно сокет туда-сюда переводить после connect()?


Можно. Хоть до хоть после)
Главное понимать при этом, что и зачем)


> это уже так, патологическая любознательность


Тогда сходи , к примеру,  на book.itep.ru, почитай про протокол TCP и вникни, что, как, когда и зачем происходит в момент установления коннекта.

Уверяю тебя - весьма пользительная инф-ция, хотя бы  для общей эрудиции по сабжу.


> делать connect() вообще в отдельном новом потоке


Задница - она терпит геморрой до определенных пределов)))


 
Ketmar ©   (2006-07-27 15:01) [21]

>Сергей М. ©   (27.07.06 13:01) [20]
я, как бы, в курсе, что там внутри TCP/IP происходит. %-)


 
Сергей М. ©   (2006-07-27 15:03) [22]


> Ketmar ©   (27.07.06 15:01) [21]


Это радует.
Так что насчет [18] ?


 
Ketmar ©   (2006-07-27 17:06) [23]

>Сергей М. ©   (27.07.06 15:03) [22]
видимо, так и перепишу. с отдельным потоком для connect() -- это шутка была. %-)
просто пока руки не доходят переписывать (читай: лениво %-).

а закрывать сокеты других потоков всё равно буду. вот. так удобнее. %-)


 
Сергей М. ©   (2006-07-27 17:12) [24]


> видимо, так и перепишу. с отдельным потоком для connect()


Да на здоровье)
Борланд тоже не брезгует пользовать блокирующий accept() в отдельном потоке.
Между accept() и connect() в этом плане невелика разница.


 
Ketmar ©   (2006-07-27 18:41) [25]

есть. наличие клиента для accept() можно определить. и не звать accept(), когда никого нет. а connect()... ну, читаем веточку... %-)



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.06 c
1-1163069924
Choco
2006-11-09 13:58
2006.12.24
Убрать заголовок формы


15-1165259045
Dree
2006-12-04 22:04
2006.12.24
Создать программу, на которой можно было бы заработать деньги!


2-1165574777
ГореПрограммер
2006-12-08 13:46
2006.12.24
работа с TChart


6-1153776477
decil
2006-07-25 01:27
2006.12.24
100-continue header и ISAPI приложение под WEB-Broker.


15-1164923453
Алхимик
2006-12-01 00:50
2006.12.24
Валидаторы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский