* При перепечатке материалов ссылка на 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

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

Delphi 8
Свойство BandType
Протокол TCP
Печать графики
EmptyTable
Печать статического текста
PhysicalRecNo
Упрощение интерфейса
Сетевые протоколы. Семиуровневая модель OSI
Компонент TQRImage
Печать простых графических фигур
Свойство RecordNumber
Асинхронный режим, основанный на событиях
Окно Tool Palette
Тип TQRShapeType
| 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


     



Данный сайт или домен продается

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