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


Функция WSASocketW (winsock2.h)

Функция WSASocket создает сокет, привязанный к конкретному поставщику транспортных услуг.

Синтаксис

SOCKET WSAAPI WSASocketW(
  [in] int                 af,
  [in] int                 type,
  [in] int                 protocol,
  [in] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [in] GROUP               g,
  [in] DWORD               dwFlags
);

Параметры

[in] af

Спецификация семейства адресов. Возможные значения для семейства адресов определяются в файле заголовка Winsock2.h .

В Windows SDK, выпущенном для Windows Vista и более поздних версий, организация файлов заголовков изменилась, а возможные значения для семейства адресов определяются в файле заголовка Ws2def.h. Обратите внимание, что файл заголовка Ws2def.h автоматически включается в Winsock2.h и никогда не должен использоваться напрямую.

В настоящее время поддерживаются значения AF_INET или AF_INET6, которые являются форматами семейств адресов Интернета для IPv4 и IPv6. Другие варианты семейства адресов (например, AF_NETBIOS для использования с NetBIOS) поддерживаются, если установлен поставщик службы Windows Sockets для семейства адресов. Обратите внимание, что значения для семейства адресов AF_ и констант семейства PF_ протоколов идентичны (например, AF_INET и PF_INET), поэтому можно использовать либо константу.

В таблице ниже перечислены распространенные значения для семейства адресов, хотя возможны и многие другие значения.

Af Значение
AF_UNSPEC
0
Семейство адресов не указано.
AF_INET
2
Семейство адресов IPv4.
AF_IPX
6
Семейство адресов IPX/SPX. Это семейство адресов поддерживается только в том случае, если установлен протокол NWLink IPX/SPX NetBIOS-совместимый транспортный протокол.

Это семейство адресов не поддерживается в Windows Vista и более поздних версиях.

AF_APPLETALK
16
Семейство адресов AppleTalk. Это семейство адресов поддерживается только в том случае, если установлен протокол AppleTalk.

Это семейство адресов не поддерживается в Windows Vista и более поздних версиях.

AF_NETBIOS
17
Семейство адресов NetBIOS. Это семейство адресов поддерживается только в том случае, если установлен поставщик сокетов Windows для NetBIOS.

Поставщик сокетов Windows для NetBIOS поддерживается в 32-разрядных версиях Windows. Этот поставщик по умолчанию устанавливается в 32-разрядных версиях Windows.

Поставщик сокетов Windows для NetBIOS не поддерживается в 64-разрядных версиях Windows, включая Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 или Windows XP.

Поставщик сокетов Windows для NetBIOS поддерживает только сокеты, для которых параметру типа присвоено значение SOCK_DGRAM.

Поставщик сокетов Windows для NetBIOS не связан напрямую с программным интерфейсом NetBIOS . Программный интерфейс NetBIOS не поддерживается в Windows Vista, Windows Server 2008 и более поздних версиях.

AF_INET6
23
Семейство адресов IPv6.
AF_IRDA
26
Семейство адресов Ассоциации инфракрасных данных (IrDA).

Это семейство адресов поддерживается только в том случае, если на компьютере установлены инфракрасный порт и драйвер.

AF_BTH
32
Семейство адресов Bluetooth.

Это семейство адресов поддерживается в Windows XP с пакетом обновления 2 (SP2) или более поздней версии, если на компьютере установлены адаптер Bluetooth и драйвер.

[in] type

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

Возможные значения для типа сокета определяются в файле заголовка Winsock2.h .

В следующей таблице перечислены возможные значения параметра типа , поддерживаемого для Windows Sockets 2.

Тип Значение
SOCK_STREAM
1
Тип сокета, предоставляющий виртуационные, надежные двусторонние потоки байтов на основе подключения с механизмом передачи данных OOB. Этот тип сокета использует протокол TCP для семейства интернет-адресов (AF_INET или AF_INET6).
SOCK_DGRAM
2
Тип сокета, поддерживающий датаграммы, которые представляют собой ненадежные буферы фиксированной (обычно небольшой) максимальной длины. Этот тип сокета использует протокол UDP для семейства интернет-адресов (AF_INET или AF_INET6).
SOCK_RAW
3
Тип сокета, предоставляющий необработанный сокет, позволяющий приложению управлять следующим заголовком протокола верхнего уровня. Чтобы управлять заголовком IPv4, для сокета необходимо задать параметр сокета IP_HDRINCL . Чтобы управлять заголовком IPv6, для сокета необходимо задать параметр сокета IPV6_HDRINCL .
SOCK_RDM
4
Тип сокета, предоставляющий надежную датаграмму сообщения. Примером этого типа является реализация протокола прагматической общей многоадресной рассылки (PGM) в Windows, которую часто называют надежным многоадресным программированием.

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

SOCK_SEQPACKET
5
Тип сокета, предоставляющий пакет псевдопотока на основе датаграмм.
 

В Windows Sockets 2 появились новые типы сокетов. Приложение может динамически обнаруживать атрибуты каждого доступного транспортного протокола с помощью функции WSAEnumProtocols . Поэтому приложение может определить возможный тип сокета и параметры протокола для семейства адресов и использовать эти сведения при указании этого параметра. Определения типов сокетов в файлах заголовков Winsock2.h и Ws2def.h будут периодически обновляться по мере определения новых типов сокетов, семейств адресов и протоколов.

В Windows Sockets 1.1 единственными возможными типами сокетов являются SOCK_DGRAM и SOCK_STREAM.

[in] protocol

Используемый протокол. Возможные параметры параметра протокола зависят от указанного семейства адресов и типа сокета. Возможные значения для протокола определяются в файлах заголовков Winsock2.h и Wsrm.h .

На Windows SDK, выпущенном для Windows Vista и более поздних версий, изменилась организация файлов заголовков, и этот параметр может быть одним из значений из типа перечисления IPPROTO, определенного в файле заголовка Ws2def.h. Обратите внимание, что файл заголовка Ws2def.h автоматически включается в Winsock2.h и никогда не должен использоваться напрямую.

Если указано значение 0, вызывающий объект не хочет указывать протокол, и поставщик услуг выберет используемый протокол .

Если параметр af имеет значение AF_INET или AF_INET6 и типSOCK_RAW, значение, указанное для протокола , задается в поле протокола заголовка пакета IPv6 или IPv4.

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

protocol Значение
IPPROTO_ICMP
1
Протокол ICMP. Это возможное значение, если параметр afAF_UNSPEC, AF_INET или AF_INET6 , а параметр типаSOCK_RAW или не указан.

Это значение протокола поддерживается в Windows XP и более поздних версиях.

IPPROTO_IGMP
2
Протокол IGMP. Это возможное значение, если параметр af имеет значение AF_UNSPEC, AF_INET или AF_INET6 , а параметр typeSOCK_RAW или не указан.

Это значение протокола поддерживается в Windows XP и более поздних версиях.

BTHPROTO_RFCOMM
3
Протокол радиочастотной связи Bluetooth (Bluetooth RFCOMM). Это возможное значение, если параметр afAF_BTH, а параметр typeSOCK_STREAM.

Это значение протокола поддерживается в Windows XP с пакетом обновления 2 (SP2) или более поздней версии.

IPPROTO_TCP
6
Протокол TCP. Это возможное значение, если параметр af имеет значение AF_INET или AF_INET6 , а параметр typeSOCK_STREAM.
IPPROTO_UDP
17
Протокол UDP. Это возможное значение, если параметр af имеет значение AF_INET или AF_INET6 , а параметр typeSOCK_DGRAM.
IPPROTO_ICMPV6
58
Протокол ICMPv6. Это возможное значение, если параметр af имеет значение AF_UNSPEC, AF_INET или AF_INET6 , а параметр typeSOCK_RAW или не указан.

Это значение протокола поддерживается в Windows XP и более поздних версиях.

IPPROTO_RM
113
Протокол PGM для надежной многоадресной рассылки. Это возможное значение, если параметр af имеет значение AF_INET , а параметр typeSOCK_RDM. В Windows SDK, выпущенном для Windows Vista и более поздних версий, этот протокол также называется IPPROTO_PGM.

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

[in] lpProtocolInfo

Указатель на структуру WSAPROTOCOL_INFO , которая определяет характеристики создаваемого сокета. Если этот параметр не имеет значение NULL, сокет будет привязан к поставщику, связанному с указанной структурой WSAPROTOCOL_INFO .

[in] g

Существующий идентификатор группы сокетов или соответствующее действие, выполняемое при создании нового сокета и новой группы сокетов.

Если g — это существующий идентификатор группы сокетов, присоедините новый сокет к этой группе сокетов при условии выполнения всех требований, заданных этой группой.

Если g не является существующим идентификатором группы сокетов, возможны следующие значения.

н Значение
0
Групповая операция не выполняется.
SG_UNCONSTRAINED_GROUP
0x01
Создайте группу сокетов без ограничений и введите новый сокет в первый член. Для группы без ограничений Winsock не ограничивает все сокеты в группе сокетов, чтобы они были созданы с одинаковыми значениями для параметров типа и протокола .
SG_CONSTRAINED_GROUP
0x02
Создайте ограниченную группу сокетов и введите новый сокет в первый член. Для ограниченной группы сокетов Winsock ограничивает все сокеты в группе сокетов, чтобы они были созданы с одинаковыми значениями для параметров типа и протокола . Ограниченная группа сокетов может состоять только из сокетов, ориентированных на подключение, и требует, чтобы подключения во всех сгруппированных сокетах были по одному адресу на одном узле.
 
Примечание Константы SG_UNCONSTRAINED_GROUP и SG_CONSTRAINED_GROUP в настоящее время не определены в общедоступном файле заголовка.
 

[in] dwFlags

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

Сочетание этих флагов может быть задано, хотя некоторые сочетания не допускаются.

Значение Значение
WSA_FLAG_OVERLAPPED
0x01
Создайте сокет, поддерживающий перекрывающиеся операции ввода-вывода.

Большинство сокетов должны создаваться с этим флагом. Перекрывающиеся сокеты могут использовать WSASend, WSASendTo, WSARecv, WSARecvFrom и WSAIoctl для перекрывающихся операций ввода-вывода, что позволяет одновременно инициировать и выполнять несколько операций.

Все функции, допускающие перекрывающиеся операции (WSASend, WSARecv, WSASendTo, WSARecvFrom, WSAIoctl), также поддерживают неперекрываемое использование перекрывающегося сокета, если значения параметров, связанных с перекрывающимися операциями, имеют значение NULL.

WSA_FLAG_MULTIPOINT_C_ROOT
0x02
Создайте сокет, который будет c_root в сеансе с несколькими точками.

Этот атрибут разрешен только в том случае, если структура WSAPROTOCOL_INFO для поставщика транспорта, создающего сокет, поддерживает механизм многоточечных или многоадресных рассылки, а уровень управления для многоточечных сеансов является корневым. На это указывает член dwServiceFlags1 структуры WSAPROTOCOL_INFO с набором флагов XP1_SUPPORT_MULTIPOINT и XP1_MULTIPOINT_CONTROL_PLANE .

Если параметр lpProtocolInfo не равен NULL, на структуру WSAPROTOCOL_INFO для поставщика транспорта указывает параметр lpProtocolInfo . Если параметр lpProtocolInfo имеет значение NULL, структура WSAPROTOCOL_INFO основана на поставщике транспорта, выбранном значениями, указанными для параметров af, type и protocol .

Дополнительные сведения о сеансе с несколькими точками см. в статье Multipoint and Multicast Semantics (Семантика многоадресной рассылки ).

WSA_FLAG_MULTIPOINT_C_LEAF
0x04
Создайте сокет, который будет c_leaf в сеансе с несколькими точками.

Этот атрибут допускается только в том случае, если структура WSAPROTOCOL_INFO для поставщика транспорта, создающего сокет, поддерживает механизм многоточечных или многоадресной рассылки, а уровень управления для многоточечных сеансов не является корневым. На это указывает член dwServiceFlags1 структуры WSAPROTOCOL_INFO с установленным флагом XP1_SUPPORT_MULTIPOINT , а флаг XP1_MULTIPOINT_CONTROL_PLANE не задан.

Если параметр lpProtocolInfo не равен NULL, на структуру WSAPROTOCOL_INFO для поставщика транспорта указывает параметр lpProtocolInfo . Если параметр lpProtocolInfo имеет значение NULL, структура WSAPROTOCOL_INFO основана на поставщике транспорта, выбранном значениями, указанными для параметров af, type и protocol .

Дополнительные сведения о сеансе с несколькими точками см. в статье Multipoint and Multicast Semantics (Семантика многоадресной рассылки ).

WSA_FLAG_MULTIPOINT_D_ROOT
0x08
Создайте сокет, который будет d_root в сеансе с несколькими точками.

Этот атрибут разрешен только в том случае, если структура WSAPROTOCOL_INFO для поставщика транспорта, создающего сокет, поддерживает механизм многоточечных или многоадресной рассылки, а плоскость данных для многоточечных сеансов является корневой. На это указывает член dwServiceFlags1 структуры WSAPROTOCOL_INFO с набором флагов XP1_SUPPORT_MULTIPOINT и XP1_MULTIPOINT_DATA_PLANE .

Если параметр lpProtocolInfo не равен NULL, на структуру WSAPROTOCOL_INFO для поставщика транспорта указывает параметр lpProtocolInfo . Если параметр lpProtocolInfo имеет значение NULL, структура WSAPROTOCOL_INFO основана на поставщике транспорта, выбранном значениями, указанными для параметров af, type и protocol .

Дополнительные сведения о сеансе с несколькими точками см. в статье Multipoint and Multicast Semantics (Семантика многоадресной рассылки ).

WSA_FLAG_MULTIPOINT_D_LEAF
0x10
Создайте сокет, который будет d_leaf в сеансе с несколькими точками.

Этот атрибут допускается только в том случае, если структура WSAPROTOCOL_INFO для поставщика транспорта, создающего сокет, поддерживает механизм многоточечных или многоадресной рассылки, а плоскость данных для сеанса с несколькими точками не является корневой. На это указывает член dwServiceFlags1 структуры WSAPROTOCOL_INFO с установленным флагом XP1_SUPPORT_MULTIPOINT и флагом XP1_MULTIPOINT_DATA_PLANE .

Если параметр lpProtocolInfo не равен NULL, на структуру WSAPROTOCOL_INFO для поставщика транспорта указывает параметр lpProtocolInfo . Если параметр lpProtocolInfo имеет значение NULL, структура WSAPROTOCOL_INFO основана на поставщике транспорта, выбранном значениями, указанными для параметров af, type и protocol .

Дополнительные сведения о сеансе с несколькими точками см. в статье Multipoint and Multicast Semantics (Семантика многоадресной рассылки ).

WSA_FLAG_ACCESS_SYSTEM_SECURITY
0x40
Создайте сокет, который позволяет задать дескриптор безопасности для сокета, содержащего список управления доступом безопасности (SACL), а не только список управления доступом на уровне пользователей (DACL).

Списки SACCL используются для создания аудитов и оповещений при проверка доступа к объекту. Для сокета происходит проверка доступа, чтобы определить, следует ли разрешить сокету привязку к определенному адресу, указанному в функции bind.

Право доступа ACCESS_SYSTEM_SECURITY управляет возможностью получения или задания списка saCL в дескрипторове безопасности объекта. Система предоставляет это право доступа только в том случае, если в маркере доступа запрашивающего потока включена привилегия SE_SECURITY_NAME .

WSA_FLAG_NO_HANDLE_INHERIT
0x80
Создайте сокет, который не является наследуемым.

Дескриптор сокета, созданный WSASocket или функцией сокета , наследуется по умолчанию. Если этот флаг установлен, дескриптор сокета не наследуется.

С помощью функции GetHandleInformation можно определить, был ли создан дескриптор сокета с набором флага WSA_FLAG_NO_HANDLE_INHERIT . Функция GetHandleInformation вернет, что задано значение HANDLE_FLAG_INHERIT .

Этот флаг поддерживается в Windows 7 с пакетом обновления 1 (SP1), Windows Server 2008 R2 с пакетом обновления 1 (SP1) и более поздних версиях

 
Важно Для многоточечных сокетов можно указать только один из флагов WSA_FLAG_MULTIPOINT_C_ROOT или WSA_FLAG_MULTIPOINT_C_LEAF и указать только один из флагов WSA_FLAG_MULTIPOINT_D_ROOT или WSA_FLAG_MULTIPOINT_D_LEAF . Дополнительные сведения см. в статье Многоточие и семантика многоадресной рассылки .
 

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

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

Примечание Это описание кода ошибки предназначено для майкрософт.
 
Код ошибки Значение
WSANOTINITIALISED
Перед использованием этой функции должен быть выполнен успешный вызов WSAStartup .
WSAENETDOWN
Произошел сбой сетевой подсистемы.
WSAEAFNOSUPPORT
Указанное семейство адресов не поддерживается.
WSAEFAULT
Параметр lpProtocolInfo не находится в допустимой части адресного пространства процесса.
WSAEINPROGRESS
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAEINVAL
Это значение верно для любого из следующих условий.
  • Указанный параметр g является недопустимым.
  • Структура WSAPROTOCOL_INFO , на которую указывает lpProtocolInfo , является неполной, содержимое является недопустимым или структура WSAPROTOCOL_INFO уже использовалась в предыдущей операции дублирования сокета.
  • Значения, указанные для членов сокета triple <af, type и protocol> , поддерживаются по отдельности, но данное сочетание не является.
WSAEINVALIDPROVIDER
Поставщик услуг вернул версию, отличаемую от 2.2.
WSAEINVALIDPROCTABLE
Поставщик служб вернул в WSPStartup недопустимую или неполную таблицу процедур.
WSAEMFILE
Больше нет доступных дескрипторов сокетов.
WSAENOBUFS
Нет свободного места в буфере. Не удается создать сокет.
WSAEPROTONOSUPPORT
Указанный протокол не поддерживается.
WSAEPROTOTYPE
Указанный протокол является неправильным типом для этого сокета.
WSAEPROVIDERFAILEDINIT
Поставщику услуг не удалось инициализировать. Эта ошибка возвращается, если поставщик многоуровневой службы (LSP) или поставщик пространства имен был неправильно установлен или поставщик не работает правильно.
WSAESOCKTNOSUPPORT
Указанный тип сокета не поддерживается в этом семействе адресов.

Комментарии

Функция WSASocket приводит к выделению дескриптора сокета и связанных ресурсов с поставщиком транспортных услуг. Большинство сокетов должны создаваться с атрибутом WSA_FLAG_OVERLAPPED , заданным в параметре dwFlags . Сокет, созданный с этим атрибутом, поддерживает использование перекрывающихся операций ввода-вывода, которые обеспечивают более высокую производительность. По умолчанию для сокета, созданного с помощью функции WSASocket , этот атрибут не перекрывается. В отличие от этого, функция сокета создает сокет, который поддерживает перекрывающиеся операции ввода-вывода в качестве поведения по умолчанию.

Если параметр lpProtocolInfo имеет значение NULL, Winsock будет использовать первый доступный поставщик транспортных услуг, который поддерживает запрошенное сочетание семейства адресов, типа сокета и протокола, указанного в параметрах af, type и protocol .

Если параметр lpProtocolInfo не имеет значение NULL, сокет будет привязан к поставщику, связанному с указанной структурой WSAPROTOCOL_INFO . В этом случае приложение может предоставить константу манифеста FROM_PROTOCOL_INFO в качестве значения для любого из параметров af, type или protocol . Это означает, что необходимо принять соответствующие значения из указанной структуры WSAPROTOCOL_INFO (iAddressFamily, iSocketType, iProtocol). В любом случае значения, указанные для af, type и protocol , передаются поставщику транспортной службы без изменений.

При выборе протокола и его поставщика услуг поддержки на основе af, типа и протокола эта процедура выбирает только базовый протокол или цепочку протоколов, а не уровень протокола сам по себе. Неоткреченные уровни протокола не считаются частичными совпадениями по типу или af. То есть они не приводят к коду ошибки WSAEAFNOSUPPORT или WSAEPROTONOSUPPORT, если подходящий протокол не найден.

Примечание Константа манифеста AF_UNSPEC по-прежнему определяется в файле заголовка, но ее использование настоятельно не рекомендуется, так как это может привести к неоднозначности при интерпретации значения параметра протокола .
 
Приложениям рекомендуется использовать AF_INET6 для параметра af и создать двойной сокет, который можно использовать как с IPv4, так и с IPv6.

Если сокет создается с помощью функции WSASocket , параметр dwFlags должен иметь атрибут WSA_FLAG_OVERLAPPED для правильной работы SO_RCVTIMEO или SO_SNDTIMEO параметров сокета. В противном случае время ожидания никогда не вступает в силу для сокета.

Сокеты, ориентированные на подключение, такие как SOCK_STREAM обеспечивают полнодуплексные подключения и должны находиться в подключенном состоянии, прежде чем можно будет отправлять или получать на них какие-либо данные. Подключение к указанному сокету устанавливается с помощью вызова функции connect или WSAConnect . После подключения данные можно передавать с помощью отправки/WSASend и повторного вызова/WSARecv . После завершения сеанса необходимо вызвать функцию closesocket , чтобы освободить ресурсы, связанные с сокетом. Для сокетов, ориентированных на подключение, необходимо вызвать функцию завершения работы , чтобы остановить передачу данных в сокете перед вызовом функции closesocket .

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

Сокеты без подключения, ориентированные на сообщения, позволяют отправлять и получать датаграммы произвольным одноранговым узлам и из нее с помощью командлета/WSASendTo и recvf from/WSARecvFrom. Если такой сокет подключен к определенному однорангового узла, датаграммы можно отправлять на этот одноранговый узел с помощью метода отправки/WSASend и получать их (только) из этого однорангового узла с помощью recv/WSARecv.

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

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

  • Вызовите функцию AdjustTokenPrivileges , чтобы включить привилегию SE_SECURITY_NAME в маркере доступа для процесса. Эта привилегия необходима для задания прав доступа ACCESS_SYSTEM_SECURITY в дескрипторе безопасности для объекта.
  • Вызовите функцию WSASocket , чтобы создать сокет с dwFlag с набором параметров WSA_FLAG_ACCESS_SYSTEM_SECURITY . Функция WSASocket завершится ошибкой, если функция AdjustTokenPrivileges не вызывается первым, чтобы включить SE_SECURITY_NAME привилегии, необходимые для этой операции.
  • Вызовите функцию SetSecurityInfo, чтобы задать дескриптор безопасности со списком системных контроль доступа (SACL) в сокете. Дескриптор сокета, возвращаемый функцией WSASocket , передается в параметре handle . Если функция будет выполнена успешно, будет задано право доступа ACCESS_SYSTEM_SECURITY в дескрипторе безопасности для сокета.
  • Вызовите функцию bind , чтобы привязать сокет к определенному порту. Если функция привязки выполняется успешно, то при попытке привязки другого сокета к тому же порту создается запись аудита.
  • Вызовите функцию AdjustTokenPrivileges , чтобы удалить привилегию SE_SECURITY_NAME в маркере доступа для процесса, так как это больше не требуется.

Дополнительные сведения о ACCESS_SYSTEM_SECURITY см. в статье О правах доступа и аудите saCL в документации по авторизации.

Группы сокетов

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

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

Функции WSASocket и WSAAccept можно использовать для явного создания и присоединения группы сокетов при создании нового сокета. Идентификатор группы сокетов для сокета можно получить с помощью функции getsockopt с параметром level , для которого задано значение SOL_SOCKET , а параметру optnameзначение SO_GROUP_ID. Группа сокетов и ее идентификатор группы сокетов остаются действительными до закрытия последнего сокета, принадлежащего этой группе сокетов. Идентификаторы групп сокетов уникальны во всех процессах для конкретного поставщика услуг. Нулевая группа сокетов указывает, что сокет не является членом группы сокетов.

Относительный приоритет группы сокетов можно получить с помощью функции getsockopt с параметром уровняSOL_SOCKET и параметром optname , равным SO_GROUP_PRIORITY. Относительный приоритет группы сокетов можно задать с помощью setockopt с параметром level , равным SOL_SOCKET, а параметру optnameSO_GROUP_PRIORITY.

Поставщик Winsock, входящий в состав Windows, позволяет создавать группы сокетов и применять SG_CONSTRAINED_GROUP. Все сокеты в ограниченной группе сокетов должны быть созданы с одинаковыми значениями для параметров типа и протокола . Ограниченная группа сокетов может состоять только из сокетов, ориентированных на подключение, и требует, чтобы подключения во всех сгруппированных сокетах были по одному адресу на одном узле. Это единственное ограничение, применяемое к группе сокетов поставщиком Winsock, включаемым в Windows. Приоритет группы сокетов в настоящее время не используется поставщиком Winsock или стеком TCP/IP, включенным в Windows.

Пример кода

В следующем примере показано использование функции WSASocket .
#ifndef UNICODE
#define UNICODE 1
#endif

// link with Ws2_32.lib
#pragma comment(lib,"Ws2_32.lib")

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi


int __cdecl wmain(int argc, wchar_t **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData = {0};
    int iResult = 0;

//    int i = 1;

    SOCKET sock = INVALID_SOCKET;
    int iFamily = AF_UNSPEC;
    int iType = 0;
    int iProtocol = 0;
    DWORD dwFlags = 0;

    // Validate the parameters
    if (argc != 5) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol> <flags>\n", argv[0]);
        wprintf(L"       opens a socket for the specified family, type, protocol, and flags\n");
        wprintf(L"       flags value must be in decimal, not hex\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17 1\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17 OVERLAPPED\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    dwFlags = _wtoi(argv[4]);
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }

    wprintf(L"Calling socket with following parameters:\n");
    wprintf(L"  Address Family = ");
    switch (iFamily) {
    case AF_UNSPEC:
        wprintf(L"Unspecified");
        break;
    case AF_INET:
        wprintf(L"AF_INET (IPv4)");
        break;
    case AF_INET6:
        wprintf(L"AF_INET6 (IPv6)");
        break;
    case AF_NETBIOS:
        wprintf(L"AF_NETBIOS (NetBIOS)");
        break;
    case AF_BTH:
        wprintf(L"AF_BTH (Bluetooth)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iFamily);
    
    wprintf(L"  Socket type = ");
    switch (iType) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case SOCK_STREAM:
        wprintf(L"SOCK_STREAM (stream)");
        break;
    case SOCK_DGRAM:
        wprintf(L"SOCK_DGRAM (datagram)");
        break;
    case SOCK_RAW:
        wprintf(L"SOCK_RAW (raw)");
        break;
    case SOCK_RDM:
        wprintf(L"SOCK_RDM (reliable message datagram)");
        break;
    case SOCK_SEQPACKET:
        wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iType);

    wprintf(L"  Protocol = %d = ", iProtocol);
    switch (iProtocol) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case IPPROTO_ICMP:
        wprintf(L"IPPROTO_ICMP (ICMP)");
        break;
    case IPPROTO_IGMP:
        wprintf(L"IPPROTO_IGMP (IGMP)");
        break;
    case IPPROTO_TCP:
        wprintf(L"IPPROTO_TCP (TCP)");
        break;
    case IPPROTO_UDP:
        wprintf(L"IPPROTO_UDP (UDP)");
        break;
    case IPPROTO_ICMPV6:
        wprintf(L"IPPROTO_ICMPV6 (ICMP Version 6)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iProtocol);

    wprintf(L"  Flags = ");
    if (dwFlags & WSA_FLAG_OVERLAPPED)
        wprintf(L"  WSA_FLAG_OVERLAPPED");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_LEAF");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_LEAF");
    if (dwFlags & WSA_FLAG_ACCESS_SYSTEM_SECURITY)
        wprintf(L"  WSA_FLAG_ACCESS_SYSTEM_SECURITY");
#ifdef WSA_FLAG_NO_HANDLE_INHERIT 
    if (dwFlags & WSA_FLAG_NO_HANDLE_INHERIT)
        wprintf(L"  WSA_FLAG_NO_HANDLE_INHERIT");
#endif
    wprintf(L" (0x%x)\n" , dwFlags);

    sock = WSASocket(iFamily, iType, iProtocol, NULL, 0, dwFlags);
    if (sock == INVALID_SOCKET) 
        wprintf(L"WSASocket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"WSASocket function succeeded\n");

        // Close the socket to release the resources associated
        // Normally an application calls shutdown() before closesocket 
        //   to  disables sends or receives on a socket first
        // This isn't needed in this simple sample
        iResult = closesocket(sock);
        if (iResult == SOCKET_ERROR) {
            wprintf(L"closesocket function zfailed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }
    WSACleanup();

    return 0;
}


Windows Phone 8. Функция WSASocketW поддерживается для приложений Магазина Windows Phone Windows Phone 8 и более поздних версий.

Windows 8.1 и Windows Server 2012 R2. Функция WSASocketW поддерживается для приложений Магазина Windows на Windows 8.1, Windows Server 2012 R2 и более поздних версий.

Примечание

Заголовок winsock2.h определяет WSASocket как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОД. Сочетание использования псевдонима, не зависящий от кодировки, с кодом, не зависящим от кодировки, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в разделе Соглашения для прототипов функций.

Требования

Требование Значение
Минимальная версия клиента Windows 8.1, Windows Vista [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2003 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header winsock2.h
Библиотека Ws2_32.lib
DLL Ws2_32.dll

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

WSAPROTOCOL_INFO

Функции Winsock

Справочник по Winsock

Принять

bind

closesocket

connect;

getsockname

getsockopt

ioctlsocket

listen

Recv

recvfrom

select

send

Sendto

setsockopt

shutdown

Сокета