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

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

Неблокирующие сокеты на 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 сервера.)


Наверх

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