Функция 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 | Значение |
---|---|
|
Семейство адресов не указано. |
|
Семейство адресов IPv4. |
|
Семейство адресов IPX/SPX. Это семейство адресов поддерживается только в том случае, если установлен протокол NWLink IPX/SPX NetBIOS-совместимый транспортный протокол.
Это семейство адресов не поддерживается в Windows Vista и более поздних версиях. |
|
Семейство адресов AppleTalk. Это семейство адресов поддерживается только в том случае, если установлен протокол AppleTalk.
Это семейство адресов не поддерживается в Windows Vista и более поздних версиях. |
|
Семейство адресов 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 и более поздних версиях. |
|
Семейство адресов IPv6. |
|
Семейство адресов Ассоциации инфракрасных данных (IrDA).
Это семейство адресов поддерживается только в том случае, если на компьютере установлены инфракрасный порт и драйвер. |
|
Семейство адресов Bluetooth.
Это семейство адресов поддерживается в Windows XP с пакетом обновления 2 (SP2) или более поздней версии, если на компьютере установлены адаптер Bluetooth и драйвер. |
[in] type
Спецификация типа для нового сокета.
Возможные значения для типа сокета определяются в файле заголовка Winsock2.h .
В следующей таблице перечислены возможные значения параметра типа , поддерживаемого для Windows Sockets 2.
Тип | Значение |
---|---|
|
Тип сокета, предоставляющий виртуационные, надежные двусторонние потоки байтов на основе подключения с механизмом передачи данных OOB. Этот тип сокета использует протокол TCP для семейства интернет-адресов (AF_INET или AF_INET6). |
|
Тип сокета, поддерживающий датаграммы, которые представляют собой ненадежные буферы фиксированной (обычно небольшой) максимальной длины. Этот тип сокета использует протокол UDP для семейства интернет-адресов (AF_INET или AF_INET6). |
|
Тип сокета, предоставляющий необработанный сокет, позволяющий приложению управлять следующим заголовком протокола верхнего уровня. Чтобы управлять заголовком IPv4, для сокета необходимо задать параметр сокета IP_HDRINCL . Чтобы управлять заголовком IPv6, для сокета необходимо задать параметр сокета IPV6_HDRINCL . |
|
Тип сокета, предоставляющий надежную датаграмму сообщения. Примером этого типа является реализация протокола прагматической общей многоадресной рассылки (PGM) в Windows, которую часто называют надежным многоадресным программированием.
Это значение типа поддерживается только в том случае, если установлен надежный протокол многоадресной рассылки. |
|
Тип сокета, предоставляющий пакет псевдопотока на основе датаграмм. |
В 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.
В таблице ниже перечислены общие значения для протокола , хотя возможны и многие другие значения.
[in] lpProtocolInfo
Указатель на структуру WSAPROTOCOL_INFO , которая определяет характеристики создаваемого сокета. Если этот параметр не имеет значение NULL, сокет будет привязан к поставщику, связанному с указанной структурой WSAPROTOCOL_INFO .
[in] g
Существующий идентификатор группы сокетов или соответствующее действие, выполняемое при создании нового сокета и новой группы сокетов.
Если g — это существующий идентификатор группы сокетов, присоедините новый сокет к этой группе сокетов при условии выполнения всех требований, заданных этой группой.
Если g не является существующим идентификатором группы сокетов, возможны следующие значения.
[in] dwFlags
Набор флагов, используемых для указания дополнительных атрибутов сокета.
Сочетание этих флагов может быть задано, хотя некоторые сочетания не допускаются.
Значение | Значение |
---|---|
|
Создайте сокет, поддерживающий перекрывающиеся операции ввода-вывода.
Большинство сокетов должны создаваться с этим флагом. Перекрывающиеся сокеты могут использовать WSASend, WSASendTo, WSARecv, WSARecvFrom и WSAIoctl для перекрывающихся операций ввода-вывода, что позволяет одновременно инициировать и выполнять несколько операций. Все функции, допускающие перекрывающиеся операции (WSASend, WSARecv, WSASendTo, WSARecvFrom, WSAIoctl), также поддерживают неперекрываемое использование перекрывающегося сокета, если значения параметров, связанных с перекрывающимися операциями, имеют значение NULL. |
|
Создайте сокет, который будет 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 (Семантика многоадресной рассылки ). |
|
Создайте сокет, который будет 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 (Семантика многоадресной рассылки ). |
|
Создайте сокет, который будет 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 (Семантика многоадресной рассылки ). |
|
Создайте сокет, который будет 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 (Семантика многоадресной рассылки ). |
|
Создайте сокет, который позволяет задать дескриптор безопасности для сокета, содержащего список управления доступом безопасности (SACL), а не только список управления доступом на уровне пользователей (DACL).
Списки SACCL используются для создания аудитов и оповещений при проверка доступа к объекту. Для сокета происходит проверка доступа, чтобы определить, следует ли разрешить сокету привязку к определенному адресу, указанному в функции bind. Право доступа ACCESS_SYSTEM_SECURITY управляет возможностью получения или задания списка saCL в дескрипторове безопасности объекта. Система предоставляет это право доступа только в том случае, если в маркере доступа запрашивающего потока включена привилегия SE_SECURITY_NAME . |
|
Создайте сокет, который не является наследуемым.
Дескриптор сокета, созданный WSASocket или функцией сокета , наследуется по умолчанию. Если этот флаг установлен, дескриптор сокета не наследуется. С помощью функции GetHandleInformation можно определить, был ли создан дескриптор сокета с набором флага WSA_FLAG_NO_HANDLE_INHERIT . Функция GetHandleInformation вернет, что задано значение HANDLE_FLAG_INHERIT . Этот флаг поддерживается в Windows 7 с пакетом обновления 1 (SP1), Windows Server 2008 R2 с пакетом обновления 1 (SP1) и более поздних версиях |
Возвращаемое значение
Если ошибка не возникает, WSASocket возвращает дескриптор, ссылающийся на новый сокет. В противном случае возвращается значение INVALID_SOCKET, а определенный код ошибки можно получить, вызвав WSAGetLastError.
Код ошибки | Значение |
---|---|
Перед использованием этой функции должен быть выполнен успешный вызов WSAStartup . | |
Произошел сбой сетевой подсистемы. | |
Указанное семейство адресов не поддерживается. | |
Параметр lpProtocolInfo не находится в допустимой части адресного пространства процесса. | |
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
Это значение верно для любого из следующих условий.
|
|
Поставщик услуг вернул версию, отличаемую от 2.2. | |
Поставщик служб вернул в WSPStartup недопустимую или неполную таблицу процедур. | |
Больше нет доступных дескрипторов сокетов. | |
Нет свободного места в буфере. Не удается создать сокет. | |
Указанный протокол не поддерживается. | |
Указанный протокол является неправильным типом для этого сокета. | |
Поставщику услуг не удалось инициализировать. Эта ошибка возвращается, если поставщик многоуровневой службы (LSP) или поставщик пространства имен был неправильно установлен или поставщик не работает правильно. | |
Указанный тип сокета не поддерживается в этом семействе адресов. |
Комментарии
Функция 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, если подходящий протокол не найден.
Если сокет создается с помощью функции 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, а параметру optname — SO_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 |