Поделиться через


Выделение дескриптора

Хотя поставщики служб сокетов Windows рекомендуется реализовать сокеты в качестве устанавливаемых объектов файловой системы (IFS), архитектура Winsock также включает поставщиков услуг, дескриптор сокетов которых не являются объектами IFS. Поставщики с дескрипторами IFS указывают это с помощью бита атрибута XP1_IFS_HANDLES в структуре WSAPROTOCOL_INFO. (Примечание. Бит атрибута XP1_IFS_HANDLES не был включен в спецификацию API версии 2.0.8, но с тех пор был добавлен с помощью механизма errata.) Клиенты Winsock SPI могут воспользоваться преимуществами поставщиков, дескрипторы сокетов которых являются дескрипторами IFS с помощью стандартных средств ввода-вывода Windows, таких как ReadFile и WriteFile.

Всякий раз, когда поставщик IFS создает дескриптор сокета, необходимо, чтобы поставщик вызывал WPUModifyIFSHandle перед предоставлением нового дескриптора клиенту SPI сокетов Windows. Эта функция принимает идентификатор поставщика и предлагаемый дескриптор IFS от поставщика в качестве входных данных и возвращает измененный дескриптор (возможно). Поставщик IFS должен предоставить только измененный дескриптор клиенту, и все запросы от клиента будут ссылаться только на этот измененный дескриптор. Измененный дескриптор гарантированно неотличим от предлагаемого дескриптора насколько это касается операционной системы. Таким образом, в большинстве случаев поставщик услуг будет просто использовать только измененный дескриптор во всей внутренней обработке. Эта функция изменения позволяет Ws2_32.dll значительно упростить процесс идентификации поставщика услуг, связанного с заданным сокетом.

Поставщики, которые не возвращают дескриптор IFS, должны получить допустимый дескриптор из Ws2_32.dll через вызов WPUCreateSocketHandle. Поставщик nonIFS должен предлагать только дескриптор сокетов Windows 2.DLL, предоставленный клиенту, и все запросы от клиента будут ссылаться только на эти дескрипторы. В качестве удобства для реализации поставщика услуг один из входных параметров, предоставляемых поставщиком в WPUCreateSocketHandle является значением контекста DWORD. Ws2_32.dll связывает это значение контекста с выделенным дескриптором сокета и позволяет поставщику услуг в любой момент получить значение контекста через вызов WPUQuerySocketHandleContext. Обычное использование этого значения контекста — хранение указателя на поставщика услуг, поддерживаемую структурой данных, используемой для хранения сведений о состоянии сокета.