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


Функция обратного вызова LPWSPSOCKET (ws2spi.h)

Функция LPWSPSocket создает сокет. Сведения о роли , которую играет LPWSPSocket в создании общего сокета, см. в разделе Общие сокеты и Общие сокеты в SPI.

Синтаксис

LPWSPSOCKET Lpwspsocket;

SOCKET Lpwspsocket(
  [in]  int af,
  [in]  int type,
  [in]  int protocol,
  [in]  LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [in]  GROUP g,
        DWORD dwFlags,
  [out] LPINT lpErrno
)
{...}

Параметры

[in] af

Спецификация семейства адресов.

[in] type

Спецификация типа для нового сокета.

[in] protocol

Протокол, используемый с сокетом, характерным для указанного семейства адресов.

[in] lpProtocolInfo

Указатель на структуру WSAProtocol_Info , которая определяет характеристики создаваемого сокета.

[in] g

Зарезервировано.

dwFlags

Спецификация атрибута сокета.

[out] lpErrno

Указатель на код ошибки.

Возвращаемое значение

Если ошибка не возникает, LPWSPSocket возвращает дескриптор, ссылающийся на новый сокет. В противном случае возвращается значение INVALID_SOCKET, а в lpErrno доступен определенный код ошибки.

Код ошибки Значение
WSAENETDOWN
Произошел сбой сетевой подсистемы.
WSAEAFNOSUPPORT
Указанное семейство адресов не поддерживается.
WSAEINPROGRESS
Выполняется блокировка вызова Windows Sockets или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAEMFILE
Больше нет доступных дескрипторов сокетов.
WSAENOBUFS
Нет свободного места в буфере. Не удается создать сокет.
WSAEPROTONOSUPPORT
Указанный протокол не поддерживается.
WSAEPROTOTYPE
Указанный протокол является неправильным типом для этого сокета.
WSAESOCKTNOSUPPORT
Указанный тип сокета не поддерживается в этом семействе адресов.
WSAEINVAL
Указан недопустимый параметр g .
 

Комментарии

Функция LPWSPSocket приводит к выделению дескриптора сокета и всех связанных ресурсов. По умолчанию созданный сокет не будет иметь перекрываемый атрибут. Поставщики сокетов Windows рекомендуется реализовать как устанавливаемые файловые системы Windows и предоставлять системные дескрипторы файлов в качестве дескрипторов сокетов. Эти поставщики должны вызвать WPUModifyIFSHandle перед возвратом из этой функции. Для поставщиков сокетов Windows, не относящихся к системе, необходимо использовать WPUCreateSocketHandle для получения уникального дескриптора сокета из Ws2_32.dll перед возвратом из этой функции. См.
Выделение дескриптора для получения дополнительных сведений.

Значения af, type и protocol предоставляются приложением в соответствующем сокете функций API или WSASocket. Поставщик услуг может игнорировать или обращать внимание на любые или все эти значения в соответствии с конкретным протоколом. Однако поставщик должен быть готов принять нулевое значение для af и type, так как Ws2_32.dll считает эти значения подстановочными знаками. Кроме того, необходимо принять значение константы манифеста FROM_PROTOCOL_INFO для любого из af, type и protocol. Это значение указывает, что приложение Windows Sockets 2 должно использовать соответствующие значения из структуры WSAProtocol_Info (iAddressFamily, iSocketType, iProtocol).

Параметр dwFlags можно использовать для указания атрибутов сокета с помощью побитового оператора OR с любым из следующих флагов.

Flag Значение
WSA_FLAG_OVERLAPPED Этот флаг приводит к созданию перекрывающегося сокета. Перекрывающиеся сокеты могут использовать LPWSPSend, LPWSPSendTo, LPWSPRecv, LPWSPRecvFrom и LPWSPIoctl для перекрывающихся операций ввода-вывода, которые позволяют инициировать несколько операций одновременно и в процессе. Все функции, допускающие перекрывающиеся операции, также поддерживают неперекрываемое использование перекрывающегося сокета, если значения параметров, связанных с перекрывающейся операцией, имеют значение NULL.
WSA_FLAG_MULTIPOINT_C_ROOT Указывает, что созданный сокет будет c_root в сеансе с несколькими точками. Допускается только в том случае, если в структуре WSAProtocol_Info протокола указана укорененная плоскость управления.
WSA_FLAG_MULTIPOINT_C_LEAF Указывает, что созданный сокет будет c_leaf в сеансе многоадресной рассылки. Допускается только в том случае, если XP1_SUPPORT_MULTIPOINT указан в структуре WSAProtocol_Info протокола.
WSA_FLAG_MULTIPOINT_D_ROOT Указывает, что созданный сокет будет d_root в сеансе с несколькими точками. Допускается только в том случае, если в структуре WSAProtocol_Info протокола указана корневая плоскость данных.
WSA_FLAG_MULTIPOINT_D_LEAF Указывает, что созданный сокет будет d_leaf в сеансе с несколькими точками. Допускается только в том случае, если XP1_SUPPORT_MULTIPOINT указан в структуре WSAProtocol_Info протокола.

Примечание

Для многоточечных сокетов необходимо указать только один WSA_FLAG_MULTIPOINT_C_ROOT или WSA_FLAG_MULTIPOINT_C_LEAF, а также точно один из WSA_FLAG_MULTIPOINT_D_ROOT или WSA_FLAG_MULTIPOINT_D_LEAF. Дополнительные сведения см. в разделе Протокольная многоадресная рассылка и многоточеняя рассылка в SPI .

Сокеты, ориентированные на подключение, такие как SOCK_STREAM обеспечивают полнодуплексные подключения и должны находиться в подключенном состоянии перед отправкой или получением данных. Подключение к другому сокету создается с помощью вызова LPWSPConnect . После подключения данные можно передавать с помощью вызовов LPWSPSend и LPWSPRecv . После завершения сеанса необходимо выполнить LPWSPCloseSocket .

Протоколы связи, используемые для реализации надежного, ориентированного на подключение сокета, гарантируют, что данные не будут потеряны и не дублируются. Если данные, для которых одноранговый протокол имеет буферное пространство, не могут быть успешно переданы в течение разумного промежутка времени, соединение считается нарушенным, и последующие вызовы завершатся ошибкой с кодом ошибки WSAETIMEDOUT.

Сокеты без подключения, ориентированные на сообщения, позволяют отправлять и получать датаграммы в произвольные одноранговые узлы и из нее с помощью LPWSPSendTo и LPWSPRecvFrom. Если такой сокет подключен с помощью LPWSPConnect к определенному одноранговой сети, датаграммы можно отправлять на этот одноранговый узел с помощью LPWSPSend и получать от этого однорангового узла (только) с помощью LPWSPRecv.

Поддержка сокетов с типом SOCK RAW не требуется, но поставщикам услуг рекомендуется поддерживать необработанные сокеты, когда это имеет смысл.

Многоуровневый поставщик услуг предоставляет реализацию этой функции, но он также является клиентом этой функции, если и когда он вызывает LPWSPSocket следующего уровня в цепочке протоколов. Некоторые особые рекомендации относятся к параметру lpProtocolInfo этой функции, так как он распространяется по уровням цепочки протоколов.

Если следующий слой в цепочке протоколов является другим слоем, то при вызове LPWSPSocket следующего слоя этот слой должен передать следующему слою lpProtocolInfo , который ссылается на ту же неизмененную WSAProtocol_Info структуру с той же неизмененную информацию о цепочке. Однако если следующий уровень является базовым протоколом (т. е. последним элементом в цепочке), этот слой выполняет подстановку при вызове LPWSPSocket базового поставщика. В этом случае на структуру WSAPROTOCOL_INFO базового поставщика следует ссылаться с помощью параметра lpProtocolInfo .

Одним из важнейших преимуществ этой политики является то, что базовые поставщики услуг не должны знать о цепочках протоколов.

Эта же политика распространения применяется при распространении структуры WSAProtocol_Info с помощью многоуровневой последовательности других функций, таких как LPWSPAddressToString, LPWSPDuplicateSocket, WSPStartup или LPWSPStringToAddress.

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header ws2spi.h

См. также раздел