Wsadata c что это
Перейти к содержимому

Wsadata c что это

  • автор:

Функция WSAStartup (winsock.h)

Функция WSAStartup инициирует использование winsock DLL процессом.

Синтаксис

int WSAStartup( [in] WORD wVersionRequired, [out] LPWSADATA lpWSAData ); 

Параметры

Самая высокая версия спецификации сокетов Windows, которую может использовать вызывающий объект. В байте высокого порядка указывается дополнительный номер версии; Байт нижнего порядка указывает основной номер версии.

Указатель на структуру данных WSADATA для получения сведений о реализации сокетов Windows.

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

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

Функция WSAStartup напрямую возвращает расширенный код ошибки в возвращаемом значении для этой функции. Вызов функции WSAGetLastError не требуется и не должен использоваться.

Код ошибки Значение
WSASYSNOTREADY Базовая сетевая подсистема не готова к сетевому обмену данными.
WSAVERNOTSUPPORTED Запрошенная версия поддержки сокетов Windows не предоставляется этой конкретной реализацией сокетов Windows.
WSAEINPROGRESS Выполняется блокировка сокетов Windows 1.1.
WSAEPROCLIM Достигнуто ограничение на количество задач, поддерживаемых реализацией сокетов Windows.
WSAEFAULT Параметр lpWSAData не является допустимым указателем.

Комментарии

Функция WSAStartup должна быть первой функцией Windows Sockets, вызванной приложением или библиотекой DLL. Это позволяет приложению или библиотеке DLL указать требуемую версию сокетов Windows и получить сведения о конкретной реализации сокетов Windows. Приложение или библиотека DLL могут выдавать дополнительные функции сокетов Windows только после успешного вызова WSAStartup.

Для поддержки различных реализаций и приложений windows Sockets, которые могут иметь функциональные отличия от последней версии спецификации сокетов Windows, согласование выполняется в WSAStartup. Вызывающий объект WSAStartup передает параметру wVersionRequested самую высокую версию спецификации сокетов Windows, которую поддерживает приложение. Библиотека DLL Winsock указывает самую высокую версию спецификации сокетов Windows, которую она может поддерживать в своем ответе. Библиотека DLL Winsock также отвечает версией спецификации windows Sockets, которую ожидает вызывающий объект.

Когда приложение или библиотека DLL вызывает функцию WSAStartup , библиотека DLL Winsock проверяет версию спецификации сокетов Windows, запрошенную приложением, переданным в параметре wVersionRequested . Если версия, запрошенная приложением, равна или выше самой низкой версии, поддерживаемой библиотекой DLL Winsock, вызов выполняется успешно, а библиотека DLL Winsock возвращает подробные сведения в структуре WSADATA , на которую указывает параметр lpWSAData . Элемент wHighVersion структуры WSADATA указывает самую высокую версию спецификации сокетов Windows, которую поддерживает библиотека DLL Winsock. Элемент wVersion структуры WSADATA указывает версию спецификации сокетов Windows, которую библиотека Winsock ожидает использовать вызывающий объект.

Если элемент wVersion структуры WSADATA недопустим для вызывающего объекта, приложение или библиотека DLL должны вызвать WSACleanup , чтобы освободить ресурсы Библиотеки DLL Winsock и не инициализировать приложение Winsock. Для поддержки этого приложения или библиотеки DLL необходимо найти обновленную версию библиотеки DLL Winsock для установки на платформе.

Текущая версия спецификации сокетов Windows — версия 2.2. Текущая библиотека DLL Winsock, Ws2_32.dll, поддерживает приложения, которые запрашивают любую из следующих версий спецификации сокетов Windows:

Чтобы получить полный доступ к новому синтаксису более поздней версии спецификации сокетов Windows, приложение должно согласовать эту более позднюю версию. В этом случае для параметра wVersionRequested следует задать запрос версии 2.2. Приложение также должно полностью соответствовать этой более поздней версии спецификации сокета Windows, например компиляция по соответствующему файлу заголовка, связывание с новой библиотекой или другие особые случаи. Файл заголовка Winsock2.h для поддержки Winsock 2 входит в состав microsoft пакет средств разработки программного обеспечения для Windows (SDK).

Сокеты Windows версии 2.2 поддерживаются в Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP, Windows 2000, Windows NT 4.0 с пакетом обновления 4 (SP4) и более поздних версий, Windows Me, Windows 98 и Windows 95 OSR2. Сокеты Windows версии 2.2 также поддерживаются в
Windows 95 с обновлением Windows Socket 2. Приложения на этих платформах обычно должны запрашивать Winsock 2.2, задавая параметр wVersionRequested соответствующим образом.

В Windows 95 и версиях Windows NT 3.51 и более ранних версиях сокеты Windows версии 1.1 является самой высокой поддерживаемой версией спецификации сокетов Windows.

Приложение или библиотека DLL, написанные для использования более ранней версии спецификации Windows Sockets, поддерживаемой библиотекой DLL Winsock, является законным и может успешно согласовать эту более раннюю версию с помощью функции WSAStartup . Например, приложение может запросить версию 1.1 в параметре wVersionRequested, переданном функции WSAStartup на платформе с библиотекой DLL Winsock 2.2. В этом случае приложение должно полагаться только на функции, которые соответствуют запрошенной версии. Не следует использовать новые коды Ioctl, новое поведение существующих функций и новые функции. Согласование версий, предоставляемое WSAStartup, в основном использовалось для того, чтобы старые приложения Winsock 1.1, разработанные для Windows 95 и Windows NT 3.51 и более ранних версий, могли работать с тем же поведением в более поздних версиях Windows. Файл заголовка Winsock.h для поддержки Winsock 1.1 входит в состав Windows SDK.

Это согласование в функции WSAStartup позволяет приложению или библиотеке DLL, использующим сокеты Windows, и winsock DLL поддерживать диапазон версий сокетов Windows. Приложение или библиотека DLL могут использовать библиотеку DLL Winsock, если диапазоны версий перекрываются. Подробные сведения о реализации сокетов Windows приведены в структуре WSADATA , возвращаемой функцией WSAStartup .

В следующей таблице показано, как WSAStartup работает с различными приложениями и версиями Winsock DLL.

Поддержка версий вызывающего абонента Поддержка версий Winsock DLL Запрос wVersion Возвращено wVersion Возвращено wHighVersion Конечный результат
1.1 1.1 1.1 1.1 1,1 use 1.1
1.0 1.1 1,0 1,1 1.0 1.0 use 1.0
1,0 1.0 1.1 1.0 1.0 1,1 use 1.0
1,1 1.0 1.1 1.1 1.1 1,1 use 1.1
1,1 1.0 1,1 1.0 1.0 Сбой приложения
1,0 1,1 1.0 WSAVERNOTSUPPORTED
1.0 1.1 1.0 1.1 1.1 1.1 1,1 use 1.1
1.1 2.0 1.0 1.1 2,0 1,1 1,1 use 1.1
2,0 1.0 1.1 2.0 2.0 2.0 2.0 use 2.0
2.0 2.2 1.0 1.1 2.0 2.2 2.0 2.0 use 2.0
2.2 1.0 1.1 2.0 2.1 2.2 2.2 2.2 2.2 use 2.2

После успешного вызова WSAStartup приложением или библиотекой DLL можно при необходимости выполнить другие вызовы сокетов Windows. Завершив использование служб библиотеки DLL Winsock, приложение должно вызвать WSACleanup , чтобы библиотека Winsock DLL освобождала внутренние ресурсы Winsock, используемые приложением.

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

Функция WSAStartup обычно приводит к загрузке вспомогательных библиотек DLL для конкретного протокола. В результате функция WSAStartup не должна вызываться из функции DllMain в библиотеке DLL приложения. Это может привести к взаимоблокировкам. Дополнительные сведения см. в разделе Функция DLL Main.

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

Примечание Приложение может вызвать функцию WSAGetLastError , чтобы определить расширенный код ошибки для других функций сокетов Windows, как это обычно делается в сокетах Windows, даже если функция WSAStartup завершается сбоем или функция WSAStartup не была вызвана для правильной инициализации сокетов Windows перед вызовом функции Сокеты Windows. Функция WSAGetLastError является одной из единственных функций в библиотеке DLL Winsock 2.2, которую можно вызвать в случае сбоя WSAStartup .

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

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

Примеры

В следующем фрагменте кода показано, как приложение, поддерживающее только сокеты Windows версии 2.2, выполняет вызов WSAStartup :

#define WIN32_LEAN_AND_MEAN #include #include #include #include // Need to link with Ws2_32.lib #pragma comment(lib, "ws2_32.lib") int __cdecl main() < WORD wVersionRequested; WSADATA wsaData; int err; /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */ wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) < /* Tell the user that we could not find a usable */ /* Winsock DLL. */ printf("WSAStartup failed with error: %d\n", err); return 1; >/* Confirm that the WinSock DLL supports 2.2.*/ /* Note that if the DLL supports versions greater */ /* than 2.2 in addition to 2.2, it will still return */ /* 2.2 in wVersion since that is the version we */ /* requested. */ if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) < /* Tell the user that we could not find a usable */ /* WinSock DLL. */ printf("Could not find a usable version of Winsock.dll\n"); WSACleanup(); return 1; >else printf("The Winsock 2.2 dll was found okay\n"); /* The Winsock DLL is acceptable. Proceed to use it. */ /* Add network programming using Winsock here */ /* then call WSACleanup when done using the Winsock dll */ WSACleanup(); > 

Требования

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

Wsadata c что это

Создавайте проект Win 32 Console с именем WinSock1, на вопрос о типе в диалоговом окне скажите «Hello Word» application. После этого есть необходимость подключения LIB файла. Это делается в меню Project далее Setting, далее Link и Object/library modules. Туда надо вписать Wsock32.lib. Вот как это выглядит.

А вот и код программы.

// WinSock1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "winsock.h" const int WINSOCK_VERSION = 0x0101; void main() < WSADATA wsaData; if (WSAStartup(WINSOCK_VERSION, &wsaData)) < printf ("winsock not bi initialized !\n"); WSACleanup(); >else printf("Winsock initial OK . \n"); if (WSACleanup()) printf("Error Cleapir\n"); else printf("Cleapir Good . \n"); >

С помощью #include «winsock.h» подключаем библиотечные функции. Объявляем константу с номером версии, которую мы будем поддерживать — WINSOCK_VERSION.

Функция WSAStartup инициализирует WinSock. Эта функция всегда самая первая при начале работы с WinSock. Вот как она описана:

int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );

Первый параметр — это версия, которая будет использоваться. Младший байт основная версия, старший байт расширение версии. Если инициализация состоялась, то вернется нулевое значение. Вобщем-то инициализация заключается в сопоставлении номера версии и реально существуюшей DLL в системе.

Второй параметр — это указатель на структуру WSADATA, в которую возвратятся параметры инициализации.

typedef struct WSAData < WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; >WSADATA, FAR * LPWSADATA;

WSACleanup завершает использование данного DLL и прерывает обращение к функциям WinSock. При удачном выполнении вернется нуль.

Структура WSADATA (winsock2.h)

Структура WSADATA содержит сведения о реализации сокетов Windows.

Синтаксис

typedef struct WSAData < WORD wVersion; WORD wHighVersion; #if . unsigned short iMaxSockets; #if . unsigned short iMaxUdpDg; #if . char *lpVendorInfo; #if . char szDescription[WSADESCRIPTION_LEN + 1]; #if . char szSystemStatus[WSASYS_STATUS_LEN + 1]; #else char szDescription[WSADESCRIPTION_LEN + 1]; #endif #else char szSystemStatus[WSASYS_STATUS_LEN + 1]; #endif #else unsigned short iMaxSockets; #endif #else unsigned short iMaxUdpDg; #endif #else char *lpVendorInfo; #endif >WSADATA, *LPWSADATA; 

Члены

Версия спецификации сокетов Windows, которую Ws2_32.dll ожидает использовать вызывающий объект. В байте высокого порядка указывается дополнительный номер версии; Байт нижнего порядка указывает основной номер версии.

Самая высокая версия спецификации сокетов Windows, которую может поддерживать Ws2_32.dll . В байте высокого порядка указывается дополнительный номер версии; Байт нижнего порядка указывает основной номер версии.

Это то же значение, что и член wVersion , если версия, запрашиваемая в параметре wVersionRequested, переданная функции WSAStartup , является самой высокой версией спецификации Windows Sockets, которую может поддерживать Ws2_32.dll .

Тип: unsigned short

Максимальное число сокетов, которые могут быть открыты. Этот элемент следует игнорировать для сокетов Windows версии 2 и более поздних версий.

Элемент iMaxSockets сохраняется для совместимости со спецификацией сокетов Windows 1.1, но не должен использоваться при разработке новых приложений. Для всех базовых поставщиков услуг не подходит ни одно значение. Архитектура сокетов Windows изменилась в версии 2 для поддержки нескольких поставщиков, а структура WSADATA больше не применяется к стеку одного поставщика.

Тип: unsigned short

Максимальный размер сообщения датаграммы. Этот элемент игнорируется для сокетов Windows версии 2 и более поздних версий.

Элемент iMaxUdpDg сохраняется для совместимости со спецификацией сокетов Windows 1.1, но не должен использоваться при разработке новых приложений. Архитектура сокетов Windows изменилась в версии 2 для поддержки нескольких поставщиков, а структура WSADATA больше не применяется к стеку одного поставщика. Для фактического максимального размера сообщения, определенного поставщика и типа сокетов Windows, приложения должны использовать метод getsockopt для получения значения параметра SO_MAX_MSG_SIZE после создания сокета.

Тип: char FAR*

Указатель на сведения о поставщике. Этот элемент следует игнорировать для сокетов Windows версии 2 и более поздних версий.

Элемент lpVendorInfo сохраняется для обеспечения совместимости со спецификацией сокетов Windows 1.1. Архитектура сокетов Windows изменилась в версии 2 для поддержки нескольких поставщиков, а структура WSADATA больше не применяется к стеку одного поставщика. Приложения, нуждающиеся в доступе к сведениям о конфигурации конкретного поставщика, должны использовать метод getsockopt для получения значения PVD_CONFIG параметров для сведений о конкретном поставщике.

Тип: char[WSADESCRIPTION_LEN+1]

Строка ASCII с символом NULL, в которую Ws2_32.dll копирует описание реализации windows Sockets. Текст (до 256 символов в длину) может содержать любые символы, кроме символов управления и форматирования. Наиболее вероятным вариантом использования приложения для этого элемента является отображение его (возможно, усеченного) в сообщении о состоянии.

Тип: char[WSASYS_STATUS_LEN+1]

Строка ASCII с символом NULL, в которую Ws2_32.dll копирует соответствующие сведения о состоянии или конфигурации. Этот параметр следует использовать вWs2_32.dll только в том случае, если информация может быть полезна для пользователя или сотрудников службы поддержки. Этот элемент не следует рассматривать как расширение параметра szDescription .

Комментарии

Функция WSAStartup инициирует использование библиотеки DLL windows Sockets процессом. Функция WSAStartup возвращает указатель на
Структура WSADATA в параметре lpWSAData.

Текущая версия спецификации сокетов Windows, возвращаемая в элементе wHighVersion
Структура WSADATA — это версия 2.2, закодированная с основным номером версии в низкобайтовом и дополнительным номером версии в высоком байте. Эта версия текущей библиотеки DLL Winsock ,Ws2_32.dll, поддерживает приложения, которые запрашивают любую из следующих версий спецификации сокетов Windows:

Примечание Приложение должно игнорировать элементы iMaxsockets, iMaxUdpDg и lpVendorInfo в WSADATA , если значение в wVersion после успешного вызова WSAStartup равно не менее 2. Это связано с тем, что архитектура сокетов Windows изменилась в версии 2 для поддержки нескольких поставщиков, и WSADATA больше не применяется к стеку одного поставщика. Появились два новых варианта сокета для предоставления сведений о поставщике: SO_MAX_MSG_SIZE (заменяет элемент iMaxUdpDg ) и PVD_CONFIG (позволяет выполнять любые другие конфигурации, относящиеся к поставщику).

Примеры

В следующем примере показано использование структуры WSADATA .

WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) < /* Tell the user that we could not find a usable */ /* WinSock DLL. */ return; >/* Confirm that the WinSock DLL supports 2.2.*/ /* Note that if the DLL supports versions greater */ /* than 2.2 in addition to 2.2, it will still return */ /* 2.2 in wVersion since that is the version we */ /* requested. */ if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) < /* Tell the user that we could not find a usable */ /* WinSock DLL. */ WSACleanup( ); return; >/* The WinSock DLL is acceptable. Proceed. */ 

Требования

Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Верхняя часть winsock2.h (включая Winsock2.h)

Простой и быстрый сервер на C/C++ с клиентом на C#: TCP версия

Всем привет. Потихоньку перебирая листы книг, занимаюсь я серверным программированием. И дошёл мой разум до того, что можно было бы и на C++ сервер написать. Ну и недолго думая(точнее вообще не думая и плохо зная плюсы), я пошёл писать сервер.

И начал я натыкаться на ошибки разные, до этого чуждые мне, да на синтаксис непонятный. И в итоге, сейчас делюсь с Вами тем, как надо и как не надо писать даже самый простой сервер.
И так начнём.

Начнём с самого главного элемента — класс сервера SServer:

#pragma once #include "includes.h" class SServer < public: SServer(); ~SServer(); void startServer(); void closeServer(); void handle(); unsigned short port; private: SOCKET this_s; WSAData wData; >; 

Тут думаю сложно не будет. SOCKET создаём как сокет для сервера, он будет слушать.
WSAData нужен для активации использования сокетов в Windows.

Это был заголовок. Перейдём к CPP:

#include "SServer.h" #include "includes.h" SServer::SServer() < >SServer::~SServer() < >void SServer::startServer() < if (WSAStartup(MAKEWORD(2, 2), &wData) == 0) < printf("WSA Startup succes\n"); >SOCKADDR_IN addr; int addrl = sizeof(addr); addr.sin_addr.S_un.S_addr = INADDR_ANY; addr.sin_port = htons(port); addr.sin_family = AF_INET; this_s = socket(AF_INET, SOCK_STREAM, NULL); if (this_s == SOCKET_ERROR) < printf("Socket not created\n"); >if (bind(this_s, (struct sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR) < printf("Socket succed binded\n"); >if (listen(this_s, SOMAXCONN) != SOCKET_ERROR) < printf("Start listenin at port%u\n", ntohs(addr.sin_port)); >handle(); > void SServer::closeServer() < closesocket(this_s); WSACleanup(); cout void SServer::handle() < while (true) < SOCKET acceptS; SOCKADDR_IN addr_c; int addrlen = sizeof(addr_c); if ((acceptS = accept(this_s, (struct sockaddr*)&addr_c, &addrlen)) != 0) < printf("send\n"); printf("sended Client connected from 0 %u.%u.%u.%u:%u\n", (unsigned char)addr_c.sin_addr.S_un.S_un_b.s_b1, (unsigned char)addr_c.sin_addr.S_un.S_un_b.s_b2, (unsigned char)addr_c.sin_addr.S_un.S_un_b.s_b3, (unsigned char)addr_c.sin_addr.S_un.S_un_b.s_b4, ntohs(addr_c.sin_port)); SClient* client = new SClient(acceptS, addr_c); >Sleep(50); > > 

А теперь по-порядку. Сначала активируем WSA вызовом WSAStartup(). MAKEWORD задаёт версию библиотек, которые будут подключаться и ссылка на объект WSAData. Обычно всегда срабатывает успешно, только ели у вас не *unix, хе-хе. Дальше. структура SOCKADDR_IN помогает нам определить заранее порт и доступность нашего сервера. А теперь поясню:

  • INETADDR_ANY говорит о том, что сервер будет доступен с любой пользовательской машины. Если указать как пишут inet_aadr(«127.0.0.1»), то это не даст вам даже в локальной сети тестировать
  • htons() — функция, которая превращает hardware to network short при этом используется ushort. Дальше будет функция ntohs() — действует наоборот
  • AF_INET — константа, отвечающая за то, что устройство использует глобальную сеть по протоколу IPv4, AF_INET6 — IPv6

SOCK_STREAM говорит об использовании TCP протокола, SOCK_DGRAM — UDP соответственно.
Вызываем обработчик входящих соединений handle() и в бесконечном цикле начинаем проверку.
Создаём сокет для входящего подключения, структуру для заполнения адреса и длину структуры.
Производим проверку на то, что не является ли наш созданный сокет подключённым по адресу такому-то от компьютера того-то. И если всё хорошо, то выводим сообщение и подключении с адреса нашего клиента и создаём клиента, который уже в дальнейшем будет сам всё обрабатывать.

Теперь же код клиента. Заголовок и имплементация вместе:

#pragma once #include "includes.h" class SClient < public: SClient(SOCKET s, SOCKADDR_IN sock_in); ~SClient(); void handle(); private: SOCKET c_sock; SOCKADDR_IN c_addr; char buffer[1024]; >; SClient::SClient(SOCKET s, SOCKADDR_IN sock_in) < c_sock = s; c_addr = sock_in; printf("Client created\n"); handle(); >SClient::~SClient() < >void SClient::handle() < while (true) < int k = recv(c_sock, buffer, sizeof(buffer), NULL); if(k>0) < printf(buffer); >Sleep(30); > > 

Тут тоже как видите, ничего сложного нет. главное это handle() функция, которую мы сразу запускаем в конструкторе. Функцию recv() предпочтительно использовать с TCP, а recvfrom() с UDP протоколом соответственно.

И на последок. В main.cpp Всё выглядит вот так:

#include "SServer.h" int main() < SServer server ; server.port = 3487;//порт это ushort - так что cin.get() и т.п. функции тут работаю некорректно. Лучше задать фвручную server.startServer(); return 0; >

А файлик, который вы так часто видели includes.h. Вот и он:

#pragma once #pragma comment(lib, "ws2_32.lib") #pragma warning(disable: 4996) #include #include #include #include "SClient.h" using namespace std; 

Итог: Мы научились создавать простой TCP сервер на C++, прочитав хорошую статью на хабре
Будет так же и UDP версия, но отличия очень малы и думаю скоро тоже будет здесь.

Так же всё есть на GitHub

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *