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

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

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

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