![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неблокирующие сокеты на WinAPi. [D7, WinXP]
DVM © (2006-08-26 19:39:00)У кого-нибудь есть какой-либо пример использования неблокирующих сокетов. Никак что-то не могу разобраться. Погряз в постоянных проверках возвращаемых функциями результатов для проверки готовности или не готовности сокета.
То ли дело блокирующие сокеты. Но нужны неблокирующие.
Ketmar (2006-08-27 00:03:00) [1]> [14] DVM © (27.08.06 00:01)
ну так отчего бы ему не работать? всё легально, по правилам. %-)
DVM (2006-08-27 00:01:00) [2]
> Ketmar © (26.08.06 22:32) [13]
Я сделал. Вроде работает. Connect() больше не блокирует.
Ketmar (2006-08-26 22:32:00) [3]> [12] DVM © (26.08.06 22:20)
я ж сказал, что код ещё не переписал, ибо ленив. %-)
DVM (2006-08-26 22:20:00) [4]
> а потом переводить сокет в нормальный блокирующий
Помогло? Сейчас проверю у себя.
Ketmar (2006-08-26 22:13:00) [5]собственно, там же, по-моему, решили так: делать connect() в неблокирующем режиме, а потом переводить сокет в нормальный блокирующий. правда, я до сих пор код не переписал. %-)
DVM (2006-08-26 22:01:00) [6]
> странно.. уже довольно дано пользуюсь компонентами от Indy,
> проблем не наблюдал, все работает четко по таймауту.
Попробуй так:
1) Indy в отдельный поток
2) Соединяемся с узлом из той же подсети, что и комп. Узла быть не должно.
3) Из основного потока закрываем сокет, пытаемя уничтожить поток.
У меня реально проходит секунд 10 после команды закрыть сокет и уничтожением потока.
Eraser (2006-08-26 21:55:00) [7]> [7] DVM © (26.08.06 21:52)
странно.. уже довольно дано пользуюсь компонентами от Indy, проблем не наблюдал, все работает четко по таймауту.
DVM (2006-08-26 21:54:00) [8]
> поступать, как это сделано в Indy
с Indy, кстати, такая же проблема. Висит поток на Connect() - прибить сразу не получается.
DVM (2006-08-26 21:52:00) [9]
> Eraser © (26.08.06 21:49) [6]
> Пришли к тому, что для блокирующих сокетов лучший вариант
> - поступать, как это сделано в Indy, к примеру, убивать
> сокет из доп. потока.
На деле же для функции connect() это не помогает.
Eraser (2006-08-26 21:49:00) [10]> [5] DVM © (26.08.06 20:54)
недавно тут данный вопрос довольно живо обсуждался.
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1153926991&n=4
Пришли к тому, что для блокирующих сокетов лучший вариант - поступать, как это сделано в Indy, к примеру, убивать сокет из доп. потока.
DVM (2006-08-26 20:54:00) [11]
> собственно, а зачем "мгновенно"? висит себе -- и пусть висит.
> надоест -- само отвалится.
Не совсем удобно. Представь программу держащую соединения с сотней источников. Скажем, 50 из них недоступны в данный момент. Потоки в циклах пытаются достучаться до недоступных источников. Большую часть времени потоки проводят в ожидании возврата от connect(). При заврешении программы потоки надо прибить. Но прибить корректно, т.е. connect() должна вернуть управление.
Или еще пример. Пользователь добавляет/удаляет такие потоки. Удаление потока должно сразу возвращать управление в программу, а не висеть на WaitFor.
Ketmar (2006-08-26 20:28:00) [12]> [3] DVM © (26.08.06 20:17)
собственно, а зачем "мгновенно"? висит себе -- и пусть висит. надоест -- само отвалится.
DVM (2006-08-26 20:17:00) [13]
> кому нужны и почему. imho, нужно использовать то, что удобнее
> в конекретной ситуации.
Именно неблокирующие нужны для мгновенного прерывания ожидающей соединения функции connect(). Для блокирующих сокетов даже вызов closesocket() из другого потока не помогает.
Eraser (2006-08-26 20:13:00) [14]> [0] DVM © (26.08.06 19:39)
> Но нужны неблокирующие.
кому нужны и почему. imho, нужно использовать то, что удобнее в конекретной ситуации.
DVM (2006-08-26 19:41:00) [15]Лучше пример клиента, читающего откуда-нибудь данные (например, с HTTP сервера.)