Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сокеты, таймаут [WinXP]


Страницы:   1 2

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(). однако искать не пойду -- тогда интересный разговор закончится. %-)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо