![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сокеты, таймаут [WinXP]
Vitaliy © (2006-07-23 22:16:00)Подскажите пожалуйста, как изменить таймаут на функцию connect для TCP сокета. Дело в том, что если я пытаюсь соедениться к компьютеру на котором не установлен ServerSocket, то клиентский сокет блокируется на 21 секунду. Как уменьшить это время?
P.S. Использую стандартные сокеты ( http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021)
Ketmar (2006-07-27 18:41:00) [1]есть. наличие клиента для accept() можно определить. и не звать accept(), когда никого нет. а connect()... ну, читаем веточку... %-)
Сергей М. (2006-07-27 17:12:00) [2]
> видимо, так и перепишу. с отдельным потоком для connect()
Да на здоровье)
Борланд тоже не брезгует пользовать блокирующий accept() в отдельном потоке.
Между accept() и connect() в этом плане невелика разница.
Ketmar (2006-07-27 17:06:00) [3]>Сергей М. © (27.07.06 15:03) [22]
видимо, так и перепишу. с отдельным потоком для connect() -- это шутка была. %-)
просто пока руки не доходят переписывать (читай: лениво %-).
а закрывать сокеты других потоков всё равно буду. вот. так удобнее. %-)
Сергей М. (2006-07-27 15:03:00) [4]
> Ketmar © (27.07.06 15:01) [21]
Это радует.
Так что насчет [18] ?
Ketmar (2006-07-27 15:01:00) [5]>Сергей М. © (27.07.06 13:01) [20]
я, как бы, в курсе, что там внутри TCP/IP происходит. %-)
Сергей М. (2006-07-27 13:01:00) [6]
> резве можно сокет туда-сюда переводить после connect()?
Можно. Хоть до хоть после)
Главное понимать при этом, что и зачем)
> это уже так, патологическая любознательность
Тогда сходи , к примеру, на book.itep.ru, почитай про протокол TCP и вникни, что, как, когда и зачем происходит в момент установления коннекта.
Уверяю тебя - весьма пользительная инф-ция, хотя бы для общей эрудиции по сабжу.
> делать connect() вообще в отдельном новом потоке
Задница - она терпит геморрой до определенных пределов)))
Ketmar (2006-07-27 12:46:00) [7]я, кстати, как раз об этом думал. только -- а резве можно сокет туда-сюда переводить после connect()? (это так, вопрос "в воздух", сам проверю, натурально %-).
однако странно, что для connect() не предусмотрено настроек. или предусмотрены, но я всё-таки куда-то не туда рою? это уже так, патологическая любознательность. %-)
зыж для себя-ненавистника удобств придумал вариант: делать connect() вообще в отдельном новом потоке. %-))
Сергей М. (2006-07-27 10:19:00) [8]
> меня всем устраивает, кроме connect()
Предлагаю разумный компромисс - connect() выполняй в неблок.режиме, а после установления коннекта продолжай работать так как тебе удобно, т.е. в блокирующем.
Ы ?
Ketmar (2006-07-27 10:11:00) [9]>Сергей М. © (27.07.06 09:52) [16]
таки да. это форма "бзика". %-) ну вот есть у меня резкая антипатия к неблокирующему. причём я уже и не помню, из-за чего она возникла. есть подозрения, что из-за моего в своё время неумения с ним толком работать.
к тому же блокирующий реально удобнее -- нет лишних проверок и асинхронных вызовов. меня всем устраивает, кроме connect(). %-)
зыж глянул в свой старый софт. тоже работаю с блокирующим режимом, для проверок на отсутствие блоков в нужных метсах использую select(). извращенец? %-)
Сергей М. (2006-07-27 09:52:00) [10]
> Ketmar © (26.07.06 14:01) [13]
>
> >Сергей М. © (26.07.06 08:45) [12]
> select() -- это круто. только в блокирующем режиме connect()
> не вернёт управление
IMHO, ты свихнулся на этом блок.режиме)
Зачем усложнять решение задачи, если существует неблок. режим, с легкостью преодолевающий все видимые проблемы ?
Ketmar (2006-07-26 19:10:00) [11]>umbra © (26.07.06 17:37) [14]
ясно. благодарю за информацию. что-то вроде этого я и предполагал. %-(
umbra (2006-07-26 17:37:00) [12]в инди сам процесс коннекта происходит в отдельном потоке, а основной поток крутится в цикле, дожидаясь таймаута. Если таймаут наступил, а поток не завершился (соединение не установлено), то возбуждается
EIdConnectTimeout. Вся эта кухня для инди 10 находится в модулеIdIOHandlerStack.pasв методеTIdIOHandlerStack.ConnectClient
Ketmar (2006-07-26 14:01:00) [13]>Сергей М. © (26.07.06 08:45) [12]
select() -- это круто. только в блокирующем режиме connect() не вернёт управление, пока не соединится или не обломится. так что select() демократию не спасает.
как сделать через неблокирующий режим -- я знаю. мне с блокирующим интересно. %-)
Сергей М. (2006-07-26 08:45:00) [14]
> 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
Eraser (2006-07-26 02:19:00) [15]> [10] Ketmar © (26.07.06 00:08)
> честно?
угу )
> найду архив с индейцами -- гляну. %-)
я попробовал это сделать.. всмысле глянуть.. так и не хватило терпения докопаться до того места, где используется API )) намудрено у них там все ))
Ketmar (2006-07-26 00:08:00) [16]>Eraser © (25.07.06 19:18) [9]
честно? просто не пользую индейцев. с ходу могу предположить, что там таки неблокирующий режим для этого используют. найду архив с индейцами -- гляну. %-)
Eraser (2006-07-25 19:18:00) [17]> [0] Vitaliy © (23.07.06 22:16)
> Подскажите пожалуйста, как изменить таймаут на функцию connect
> для TCP сокета. Дело в том, что если я пытаюсь соедениться
> к компьютеру на котором не установлен ServerSocket, то клиентский
> сокет блокируется на 21 секунду. Как уменьшить это время?
можно глянуть исходники Indy.. ведь там же как-то это реализовано..
Ketmar (2006-07-25 18:28:00) [18]>Сергей М. © (25.07.06 16:41) [7]
э-э-э... ну, я же не сказал, оно именно там. если бы я это точно знал -- я бы так и написал. а были только подозрения. "подозрение не есть уверенность, можно и ошибиться" (ц) в других функциях управления сокетами я тоже ничего не нашёл по этому поводу. но вот "нутром чую", что должно быть что-то. (прим.: этимологию слова "нутро" пояснить не могу)
зыж при помощи WSAIoctl() как минимум устанавливаются таймауты для keep-alive пакетов. что важно, ибо по умолчанию обрыв соединения регистрируется через совершенно неприличное время. %-)
Сергей М. (2006-07-25 16:41:00) [19]
> 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 16:23:00) [20]>Сергей М. © (25.07.06 13:30) [5]
понятно, что в реестре много чего есть. но меня мучают смутные подозрения насчёт наличия возможности управления через WSAIoctl(). однако искать не пойду -- тогда интересный разговор закончится. %-)