* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна! RSS



Устаревшие функции WinSock 1
19 марта 2009

В этом разделе мы рассмотрим те устаревшие функции, которые не стоит использовать в 32-разрядных программах. Рассмотрим мы их, разумеется, очень обзорно, только для того, чтобы после прочтения статьи вас не смущали упоминания этих функций и связанных с ними ошибок, которые иногда встречаются в MSDN'е.
В 16-разрядных версиях Windows используется так называемая корпоративная многозадачность: каждая программа время от времени должна добровольно возвращать управление операционной системе, чтобы та могла передать управление другой программе. При этом если какая-то программа поведёт себя некорректно и не вернёт управление системе, то все остальные программы не смогут продолжать работу. Другим недостатком такой модели является то, что в ней невозможно распараллеливание работы в рамках одного процесса, т.е. создание нитей.
При такой модели многозадачности использование блокирующих сокетов может привести к остановке всей системы, если не будут приняты дополнительные меры. В Windows проблема решается следующим образом: библиотека сокетов во время ожидания периодически вызывает заранее указанную функцию. В 16-разрядных версиях Windows эта функция по умолчанию извлекает сообщение из системной очереди и передаёт его соответствующему приложению. Таким образом, остальные приложения не прекращают работу во время блокирующего вызова.
В очереди сообщений могут находиться сообщения и для того приложения, которое выполняет блокирующий вызов. В этом случае будет снова вызвана оконная процедура, инициировавшая блокирующую операцию. Это напоминает рекурсию, при которой процедура вызывает сама себя: в памяти компьютера будут одновременно две активации этой процедуры. Упрощённо это выглядит так: оконная процедура вызывает блокирующую функцию (например, Accept), а та, в свою очередь, снова вызывает ту же самую оконную процедуру. При этом вторая активация не может выполнять никаких операций с сокетами: они будут завершены с ошибкой WSAEInProgress. Эта ошибка не является фатальной, она указывает, что в данный момент выполняется блокирующая операция, и программа должна подождать её завершения и лишь потом пытаться работать с сокетами (т.е. не раньше, чем первая активация оконной процедуры вновь получит управление). Существует специальная функция WSAIsBlocking, которая возвращает True, если в данный момент выполняется блокирующая операция и работа с сокетами невозможна.
Вторая активация процедуры может прервать блокирующий вызов с помощью функции WSACancelBlockingCall. При этом первая активация получит ошибку WSAECancelled.
Программа может устанавливать свою процедуру, которая будет вызываться во время выполнения блокирующей операции. Для этого используются функции WSASetBlockingHook и WSAUnhookBlockingHook.
Данная модель достаточно неудобна, поэтому разработчики WinSock 1 рекомендуют использовать более приспособленную к особенностям Windows модель асинхронных сокетов.
В 32-разрядных версиях WinSock такая модель работы поддерживается в полном объёме, за исключением того, что по умолчанию при блокирующем вызове не вызывается никакая функция. Поэтому, если не использовать WSASetBlockingHook, в 32-разрядном приложении невозможно получить ситуацию, когда операция с сокетом не будет выполнена из-за того, что в этот момент уже выполняется другая операция, и второй активации оконной процедуры из-за блокирующего вызова тоже не будет создано. Отметим, что разные нити могут одновременно выполнять блокирующие операции с сокетами, и это не приведёт к появлению ошибки WSAEInProgress.
Все перечисленные выше функции формально исключены из спецификации WinSock 2, хотя фактически они присутствуют в библиотеке WS2_32.dll и при необходимости могут быть использованы (использование, правда, осложняется тем, что в новых версиях MSDN'а отсутствует их описание). Тем не менее, причин использовать эту неудобную модель в 32-разрядных версиях Windows, видимо, нет.


Теги: asus socket, IP, borland delphi, User Datagram Protocol, Unix, SQL-сервер Borland Delphi

Статьи по теме:

Суперклассинг
Пример создания задания на печать
Проблемно-ориентированные ППП
Свойство Expression для TQRExpr
Свойство ColumnTopPosition
Печать графики
Выбор шрифта
ПРОСТЕЙШИЙ DATASET
Размер стека
RestructureTable
OnCopyDateTimeAsString
PackTable
Свойство ChildBand
Настольные издательские системы
Ключевые слова
| Borland Delphi | Alex |
 


Пн Вт Ср Чт Пт Сб Вс
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30


     



Rambler's Top100

Данный сайт или домен продается ICQ: 403-353-727

© 2009 Seoliga.ru | Borland Delphi | Устаревшие функции WinSock 1. Регион сайта: Москва и Санкт-Петербург