Сокеты
В версии WinSock 2 введено понятие группы сокетов, которое позволяет приложению сообщить сервис-провайдеру, что данный набор сокетов имеет определенные идентичные свойства (атрибуты). К числу этих свойств относятся относительные приоритеты отдельных сокетов в пределах группы, а также спецификация качества услуг (QOS).
Приложения, реализующие мультимедийные потоки данных, нуждаются в организации специфических взаимоотношений между наборами сокетов. Как минимум это может включать подсказку сервиспровайдеру о приоритетности потоков информации. Например, при проведении видеоконференций звуковое сопровождение должно иметь более высокий приоритет, чем видеоинформация. Кроме того, существуют сервиспровайдеры, которые могут обеспечить запрашиваемое качество обслуживания (код QOS).
WSASocket и WSAAccept представляют собой два новых оператора, используемых для создания сокетов и групп, а также для включения сокета в определенную группу. Идентификатор группы сокета можно узнать с помощью оператора getsockopt с опцией SO_GROUP_ID. Установка и проверка относительного приоритета сокетов в группе осуществляется соответственно операторами getsockopt и setsockopt с опцией SO_GROUP_PRIORITY. Опции сокетов приведены в таблице 4.8.
Сводная таблица кодов операций для процедуры ioctl приведена ниже (таблица 4.9). Оператор WSAIoctl поддерживает также все операции, специфицированные для процедуры iocltsocket.
код операции | входной тип | выходной тип | значение |
---|---|---|---|
SIO_ASSOCIATE_HANDLE | зависит от API | не использ. | Связывает сокет с заданным дескриптором интерфейса-партнера |
SIO_ENABLE_CIRCULAR_QUEUEING | не использ. | не использ. | Разрешает организацию кольцевой очереди |
SIO_FIND_ ROUTE | struct sockaddr | не использ. | Запрос маршрута до заданного адреса |
SIOFLUSH | не использ. | не использ. | Аннулирует текущее содержимое очереди на отправку |
SIO_GET_BROADCAST_ADDRESS | не использ. | struct sockaddr | Определяет протокольно-зависимый широковещательный адрес для использования в sendto/ WSASendto |
SIOGET_QOS | не использ. | QOS | Определяет текущую спецификацию сокета |
SIO_GET_ GROUP_QOS | не использ. | QOS | Определяет спецификацию группы, к которой принадлежит сокет |
SIO_MULTIPOINT LOO КВАСК | BOOL | не использ. | Определяет, будут ли данные, посланные в ходе многоточечной сессии, получены сокетом локальной ЭВМ |
SIO_MULTICAST_SCOPE | int | не использ. | Определяет режим, в котором будут осуществляться мультикастинг-обмены |
SIOSET_QOS | QOS | не использ. | Устанавливает новую спецификацию для сокета |
SIO_SET_ GROUP_QOS | QOS | не использ. | Устанавливает новую спецификацию группы, к которой принадлежит сокет |
SIO_TRANSLATE_HANDLE | int | зависит от API | Возвращает дескриптор для сокета s, который соответствует контексту интерфейса-партнера |
Оператор WSAAccept устанавливает условное соединение и имеет следующую структуру параметров (таблица 4.9.1).
Программа извлекает очередную заявку на соединение из очереди сокета s и проверяет с помощью специфицированной программы выполнение условий соединения. Если условия выполнены, возвращается флаг CF_ACCEPT, программа создает новый сокет и осуществляет подключение его к группе в соответствии с параметром g, выработанным программой проверки условий. Вновь созданный сокет имеет такие же параметры, что и s, включая те, что задаются операторами контроля WSAAsyncSelect или WSAEventSelec t. Если программа проверки условия вернула флаг CF_REJECT, запрос на соединение аннулируется. Если невозможно принять решение немедленно, программа проверки условия должна вернуть флаг CF_DEFER, при этом никаких действий не предпринимается. Когда приложение будет готово обслужить запрос на соединение, оно снова запустит процедуру WSAAccept и пришлет либо CF_ACCEPT, либо CF_REJECT в качестве результата проверки условий.
Для сокетов, которые остаются в блокирующем режиме, когда в очереди нет запросов на соединение, WSAAccept блокирует вызывающую программу до появления заявки на соединение. Для сокетов неблокирующего типа, когда очередь пуста, оператор WSAAccept вернет флаг ошибки.
При завершении процедуры в addrlen будет записана реальная длина адреса в байтах. Если addr и (или) addrlen равны нулю, это означает, что нет никакой информации об адресе удаленного адресата. В противном случае эти параметры несут в себе реальную информацию независимо от результатов проверки условий.
- Современные версии WinSock обеспечивают протокольно-независимый доступ ко всем ресурсам сети, включая такие стандартные приложения, как DNS, SAP, X.500 и т.д.
- Они позволяют реализовать несколько сессий ввода/вывода одновременно.
- Они поддерживают любые стандартные уровни сервиса (QOS — Quality of service), осуществляют объединение сокетов по группам в соответствии с их параметрами.
- Допускается многопротокольная широковещательная или мультикастинг-адресация.
- Предусматривается совместное использование сокетов несколькими процессами, условное создание сокетов и объединение их в группы.
Введено понятие WOSA-интерфейса (Windows Open Service Architecture), который обеспечивает связь между прикладной программой и сетевыми процедурами ОС. Этот интерфейс заметно упрощает программирование при работе с пакетами.
Каждая процедура, распознаваемая WOSA, имеет, в свою очередь, несколько интерфейсов, ориентированных на конкретных сервис-провайдеров. Применение этих средств реализуется через DLL.
WinSock, следуя модели WOSA, обеспечивает прикладной интерфейс для сетевого программирования API (Application Programming Interface), который организует доступ к транспортным услугам и серверу имен сервис-провайдера SPI (Service Provider Interface). SPI ориентирован на использование в рамках 32-битовой модели Microsoft Windows.
Транспортные сервис-провайдеры (например, TCP/IP или IPX/SPX) и доменные серверы (DNS) в WinSock представляют собой динамические библиотеки (DLL) с одной точкой входа для процедур инициализации WSPStartup или NSPStartup (обратите внимание на то, что здесь под сервис-провайдером подразумевается система, способная предоставить определенный вид услуг). Все остальные процедуры сервис-провайдера сделаны доступными для WinSock DLL через диспетчерскую таблицу. Динамическая библиотека сервис-провайдера загружается в память WinSock DLL только по мере необходимости и выгружается, когда она более не нужна. Динамическая библиотека сервис-провайдера имеет обычно расширение .WSP или .NSP. Процедуры WinSock SPI имеют префиксы (таблица 4.9.2.).
Сервис-провайдеры WinSock при работе со строками применяют UNICODE. WinSock DLL выполняют необходимые преобразования при работе с приложениями, использующими ANSI или UNICODE.