![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TServerSocket, TClientSocket. Синхронный и асинхронный, блокирующ [D6, Win95/98, WinME, NT4, Win2k, WinXP]
Анонимщик © (2004-04-22 11:33:00)Синхронный и асинхронный, блокирующий и неблокирующий.
Что в контектсе сокетов значит "Синхронный и асинхронный, блокирующий и неблокирующий"?
Я почему-то думал, что синхронный режим - тот, что позволяет обеим сторонам общаться,
синхронизируя посылку данных друг другу. Т.е. работа в синхронном режиме подразумевает
некий диалог между ними.
Но вот читаю: "Асинхронными они названы по той причине, что их выполнение связано с
определенным диалогом и ни начало, ни завершение не ограничено какими-либо временными
рамками". Т.е. с точностью до наоборот. Почему так, можно спросить?
Далее, если асинхронный режим тот, что подразумевает диалог, а не просто пересылку данных
любой их сторон другой стороне, то, выходит, асинхронный режим - блокирующий, т.е.
одна из сторон на время своего посылания данных блокирует другую?
И еще одно. Если режим асинхронный, то тогда нужно выставить тип для сервера - ctThreadBlocking,
а для клиента - ctBlocking? Тогда сервер для каждого клиентского соединения создает поток,
который с этим клиентом и работает. И вот мне не понятно, почему того же нельзя сделать
и для синхронного режима в принципе, т.е. почему нет этой возмодности.
Короче, я все напутал, прошу помочь распутать.
И последнее. Можно ли создавать TClientSocket не в главном потоке? Прочитал, что операционная
система сообщает о событиях для сокета в то окно, с контекстом потока которого сокет связан.
Естественно, в дочернем потоке никакого окна нет. Так дойдет ли куда-нибудь сообщение вообще?
Впрочем, так я уже делал, но, кроме этого, создавал еще и поток, который занимается обработкой
принимаемых/отправляемых данных для этого сокета. И данные приходят и отправляются. Но смутные
сомнения терзают все равно.
Короче говоря, пожалуйста, те, кто знают, пусть разжуют, правильно сформулируют и ответят.
Digitman (2004-04-22 14:05:00) [41]
> Можно ли создавать TClientSocket не в главном потоке?
можно.. в любом потоке, в котором тебе заблагорассудится
> Прочитал, что операционная
> система сообщает о событиях для сокета в то окно, с контекстом
> потока которого сокет связан.
выкинь из этого фразы, упоминающие "сокет" - будет совершенно правильное утверждение
но если речь идет о сокете как объекте класса TServer/ClientSocket, инициализируемом для работы в режиме non-blocking, то в этом режиме по-умолчанию задействуется механизм асинхронных нотификаций с посылкой сообщений окну, создаваемому автоматически при вызове Open ... тот поток, который вызвал Open, и будет "владеть" окном и монопольными правами/обязанностями по ожиданию/выборке/диспетчеризации оконных сообщений
Polevi (2004-04-22 13:51:00) [42]TClientSocket создает окно
тебе нужно написать цикл выборки сообщений из очереди дополнительного потока
while GetMessage(msg,0,0,0) do DispatchMessage(msg)
Анонимщик (2004-04-22 13:43:00) [43]Спасибо.
Теперь про TClientSocket и обоаботке сообщений.
Digitman (2004-04-22 13:00:00) [44]в первом приближении считай , что термин "синхронный режим" - синоним понятия "режим блокирующих вызовов"
в режиме же неблокирующих вызовов может использовать, а можно и не использовать асинхроннуюнотификацию (извещения) об интересующих тебя произошедших по факту событиях
прямая аналогия с "конторой" : если она поддерживает сервис телефонного извещении тебя о доставке, то это и есть "режим асинхронной нотификации" ... если же не поддерживает, то ты не вправе сделав заказ требовать телефонного извещения о доставке, но ничто не удерживает тебя у телефона ... сделав заказ, ты волен заниматься своими делами, однако тебе придется время от времени выходить из дома и проверять, не явился ли посыльный
Анонимщик (2004-04-22 12:48:00) [45]Спасибо, Digitman. Почти не сомневался, что ответишь именно ты. С этим прояснилось.
А как насчет синхронности/асинхронности и прочих вопросов?
Digitman (2004-04-22 12:06:00) [46]давай на время забудем "сокеты", они здесь в общем случае ни при чем
понятия "блокирующий" и "неблокирующий" относится прежде всего к вызовам ф-ций и процедур в текущем кодовом потоке
разница между этими понятиями весьма относительна - любой "неблокирующий" вызов с определенной т.з. можно назвать и "блокирующим" ... разница в том, что "неблокирующий" вызов приводит к практически немедленному возврату управления вызывающему коду, ВНЕ зависимости от условий исполнения алгоритма вызываемой п/программы, в то время как "блокирующий" вызов вернет управление только после исполнения всей предусмотренной алгоритмом п/программы функциональности
эти понятия относятся прежде всего к различной функциональности алгоритма п/программы, которая задействуется в том или ином случае
рассмотрим простой пример - пусть "вызовом" считается делаемый тобой по телефону заказ пиццы у некоей конторы, доставляющей товар на дом ... время доставки, как правило, заранее оговорить сложно - это время в общем случае зависит от множества факторов (пробки на дорогах, очередь доставки заказов и пр.)
вот ты звонишь, делаешь заказ и оговариваешь условия доставки и извещения :
1) я буду ждать посыльного с пиццей у дверей подъезда, сколько бы времени это ни заняло
это - "блокирующий" режим, пока ты ждешь доставки у дверей подъезда, ты связан этим ожиданием по рукам и ногам и ничем более заняться не можешь
2) я буду ждать ответного звонка с извещением о том, что посыльный УЖЕ стоит у моего подъезда с заказом (либо произошел некий глобальный катаклизм, и заказ получить не могу)
это - "неблокирующий" режим, ты не торчишь как идиот у дверей своего подъезда, а волен заниматься какими-то иными своими делами; как только тебе позвонят, это и будет фактом подтверждения фактической доставки либо отказ по причине катаклизма.. все что остается - отложить на секунду свои дела, спуститься к дверям подъезда и получить заказ, если он действительно доставлен
считай, что контора, доставляющая заказ, предоставляет по твоему выбору оба режима, т.е. в зависимости от твоего предпочтения готова организовать алгоритм своих последующих действий по заранее оговоренным с тобой соглашениям .. напротив, эта контора может и не предоставлять один из этих сервисов ("режимов"), это ее исключительная прерогатива .. в этом случае выбора у тебя нет, и ты волен либо согласиться с условиями предлагаемого конторой сервиса либо отказаться от ее услуг в принципе
то же самое - с ф-циями и процедурами ядра и его подсистем (winsock - не исключение) : некоторые п/программы ("конторы") предоставляют оба механизма, некоторые предоставляют только один из них