Ескерім
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Структура addrinfoex4 используется функцией GetAddrInfoEx для хранения сведений об адресе узла при запросе определенного сетевого интерфейса.
Синтаксис
typedef struct addrinfoex4 {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
size_t ai_addrlen;
PWSTR ai_canonname;
struct sockaddr *ai_addr;
void *ai_blob;
size_t ai_bloblen;
GUID *ai_provider;
struct addrinfoex4 *ai_next;
int ai_version;
PWSTR ai_fqdn;
int ai_interfaceindex;
HANDLE ai_resolutionhandle;
} ADDRINFOEX4, *PADDRINFOEX4, *LPADDRINFOEX4;
Члены
ai_flags
Флаги, указывающие параметры, используемые в функции GetAddrInfoEx .
Поддерживаемые значения для элемента ai_flags определяются в файле Winsock2.h include и могут быть комбинацией следующих параметров.
Значение | Значение |
---|---|
|
Адрес сокета будет использоваться при вызове функции bind . |
|
Каноническое имя возвращается в первом элементе ai_canonname . |
|
Параметр nodename , передаваемый в функцию GetAddrInfoEx , должен быть числовой строкой. |
|
Если этот бит задан, выполняется запрос на адреса IPv6 и IPv4 с AI_V4MAPPED.
Этот параметр поддерживается в Windows Vista и более поздних версиях. |
|
GetAddrInfoEx будет разрешаться, только если настроен глобальный адрес. Адрес замыкания на себя IPv6 и IPv4 не считается допустимым глобальным адресом.
Этот параметр поддерживается в Windows Vista и более поздних версиях. |
|
Если запрос GetAddrInfoEx для IPv6-адресов завершается сбоем, выполняется запрос службы имен для IPv4-адресов, и эти адреса преобразуются в формат IPv4-адресов.
Этот параметр поддерживается в Windows Vista и более поздних версиях. |
|
Адресная информация получена из результатов, не заслуживающих доверия.
Если этот параметр задан в параметре pHintsgetAddrInfoEx, поставщик пространства имен NS_EMAIL возвращает как заслуживающие доверия, так и неавторитетные результаты. Если этот параметр не задан, возвращаются только достоверные результаты. Этот параметр поддерживается только в Windows Vista и более поздних версиях для пространства имен NS_EMAIL . |
|
Сведения об адресе передаются из защищенного канала.
Если задан бит AI_SECURE , поставщик пространства имен NS_EMAIL вернет результаты, полученные с повышенной безопасностью, чтобы свести к минимуму возможные спуфинговы. Если этот параметр задан в параметре pHintsgetAddrInfoEx, поставщик пространства имен NS_EMAIL возвращает только результаты, полученные с повышенной безопасностью, чтобы свести к минимуму возможный спуфинг. Этот параметр поддерживается только в Windows Vista и более поздних версиях для пространства имен NS_EMAIL . |
|
Сведения об адресе относятся к предпочтительному имени публикации с определенным пространством имен.
Если этот параметр задан в параметре pHintsgetAddrInfoEx, в параметре pName не должно быть указано имя, а поставщик пространства имен NS_EMAIL вернет предпочтительные имена для публикации. Этот параметр поддерживается только в Windows Vista и более поздних версиях для пространства имен NS_EMAIL . |
|
Полное доменное имя возвращается в первом элементе ai_fqdn .
Если этот параметр задан в параметре pHintsgetAddrInfoEx и в параметре pName указано неструктурированное имя (одна метка), возвращается полное доменное имя, в которое в конечном итоге разрешается имя. Этот параметр поддерживается в Windows 7, Windows Server 2008 R2 и более поздних версиях. |
|
Указание поставщику пространства имен о том, что запрашиваемое имя узла используется в сценарии общей папки. Поставщик пространства имен может игнорировать это указание.
Этот параметр поддерживается в Windows 7, Windows Server 2008 R2 и более поздних версиях. |
|
Отключите автоматическое кодирование международного доменного имени с помощью Punycode в функциях разрешения имен, вызываемых функцией GetAddrInfoEx .
Этот параметр поддерживается в Windows 8, Windows Server 2012 и более поздних версиях. |
|
Указывает, что текущий объект расширен: addrinfoex2 или более поздней версии.
Этот параметр поддерживается в Windows 8.1, Windows Server 2012 R2 и более поздних версиях. |
|
Дескриптор разрешения возвращается в элементе ai_resolutionhandle .
Этот параметр поддерживается в Windows 10, Windows Server 2016 и более поздних версиях. |
ai_family
Семейство адресов.
Возможные значения для семейства адресов определяются в файле заголовка Ws2def.h . Обратите внимание, что файл заголовка Ws2def.h автоматически включается в Winsock2.h и никогда не должен использоваться напрямую.
В настоящее время поддерживаются значения AF_INET или AF_INET6, которые являются форматами семейства адресов Интернета для IPv4 и IPv6. Другие параметры семейства адресов (например, AF_NETBIOS для использования с NetBIOS) поддерживаются, если установлен поставщик служб Windows Sockets для семейства адресов. Обратите внимание, что значения для семейства адресов AF_ и констант семейства протоколов PF_ идентичны (например, AF_INET и PF_INET), поэтому можно использовать любой из констант.
В таблице ниже перечислены распространенные значения для семейства адресов, хотя возможны и многие другие значения.
ai_socktype
Тип сокета. Возможные значения для типа сокета определяются в включаемом файле Winsock2.h .
В следующей таблице перечислены возможные значения типа сокета, поддерживаемого для сокетов Windows 2.
Значение | Значение |
---|---|
|
Предоставляет виртуационные, надежные двусторонние потоки байтов на основе соединений с механизмом передачи данных OOB. Использует протокол TCP для семейства адресов Интернета (AF_INET или AF_INET6). Если элемент ai_familyявляется AF_IRDA, то единственным поддерживаемым типом сокета является SOCK_STREAM . |
|
Поддерживает датаграммы, которые являются ненадежными буферами фиксированной (обычно небольшой) максимальной длины без подключения. Использует протокол 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_DATAGRAM и SOCK_STREAM.
ai_protocol
Тип протокола. Возможные варианты зависят от указанного семейства адресов и типа сокета. Возможные значения для ai_protocol определены в файлах заголовков Winsock2.h и Wsrm.h .
На Windows SDK, выпущенном для Windows Vista и более поздних версий, организация файлов заголовков изменилась, и этот член может быть одним из значений типа перечисления IPPROTO, определенного в файле заголовка Ws2def.h. Обратите внимание, что файл заголовка Ws2def.h автоматически включается в Winsock2.h и никогда не должен использоваться напрямую.
Если для ai_protocol указано значение 0, вызывающий объект не хочет указывать протокол, и поставщик услуг выберет ai_protocol для использования. Для протоколов, отличных от IPv4 и IPv6, задайте для ai_protocol нулевое значение.
В следующей таблице перечислены общие значения для элемента ai_protocol , хотя возможны и многие другие значения.
Если элемент ai_familyAF_IRDA, то ai_protocol должен иметь значение 0.
ai_addrlen
Длина (в байтах) буфера, на который указывает элемент ai_addr .
ai_canonname
Каноническое имя узла.
ai_addr
Указатель на структуру sockaddr . Элемент ai_addr в каждой возвращаемой структуре addrinfoex4 указывает на заполненную структуру адресов сокета. Длина каждой возвращаемой структуры addrinfoex4 в байтах указывается в элементе ai_addrlen .
ai_blob
Указатель на данные, используемые для возврата сведений о пространстве имен конкретного поставщика, связанных с именем за пределами списка адресов. Длина буфера, на который указывает ai_blob , должна быть указана в элементе ai_bloblen в байтах.
ai_bloblen
Длина элемента ai_blob в байтах.
ai_provider
Указатель на GUID определенного поставщика пространства имен.
ai_next
Указатель на следующую структуру в связанном списке. Этот параметр имеет значение NULL в последней структуре addrinfoex4 связанного списка.
ai_version
Номер версии этой структуры. В настоящее время для этой версии структуры используется значение 4.
ai_fqdn
Полное доменное имя узла.
ai_interfaceindex
Индекс интерфейса, определенный IP_ADAPTER_ADDRESSES. Свойство IfIndex , возвращаемое в GetAdaptersAddresses.
ai_resolutionhandle
Дескриптор указывает на полное доменное имя узла.
Комментарии
Структура addrinfoex4 поддерживается в Windows 10 и Windows Server 2016
Структура addrinfoex4 используется функцией GetAddrInfoEx для хранения сведений об адресе узла, когда AI_EXTENDED | AI_FQDN | AI_CANONNAME | AI_RESOLUTION_HANDLE битов заданы в элементе addrinfoex4.ai_flags передаваемых через GetAddrInfoEx.параметр hints .
Структура addrinfoex4 — это расширенная версия структуры addrinfoex , которая может возвращать каноническое имя, полное доменное имя узла и дескриптор полного доменного имени. В свою очередь, GetAddrInfoEx — это расширенная версия структур addrinfo и addrinfoW , используемых с функциями getaddrinfo и GetAddrInfoW . Функция GetAddrInfoEx позволяет указать поставщика пространства имен для разрешения запроса. Для использования с протоколами IPv6 и IPv4 разрешение имен может выполняться системой доменных имен (DNS), локальным файлом hosts , поставщиком электронной почты ( пространство имен NS_EMAIL ) или другими механизмами именования.
Данные большого двоичного объекта в элементе tha ai_blob используются для возврата дополнительных сведений о пространстве имен поставщика, связанных с именем. Формат данных в элементе ai_blob зависит от конкретного поставщика пространства имен. В настоящее время данные больших двоичных объектов используются поставщиком пространства имен NS_EMAIL для предоставления дополнительных сведений.
При определении ЮНИКОДа или _UNICODE addrinfoex4 определяется как addrinfoex4W, версия юникода этой структуры. Строковые параметры определяются для типа данных PWSTR и используется структура addrinfoex4W .
Если юникод или _UNICODE не определены, addrinfoex4 определяется как addrinfoex4A, версия ANSI этой структуры. Строковые параметры имеют тип данных char * и используется структура addrinfoex4A .
После успешного вызова GetAddrInfoEx связанный список структур addrinfoex4 возвращается в параметре ppResult , передаваемом функции GetAddrInfoEx . Список можно обработать, следуя указателю, указанному в элементе ai_next каждой возвращаемой структуры addrinfoex4 , пока не будет обнаружен указатель NULL . В каждой возвращаемой структуре addrinfoex4члены ai_family, ai_socktype и ai_protocol соответствуют соответствующим аргументам в вызове функции сокета или WSASocket . Кроме того, элемент ai_addr в каждой возвращаемой структуре addrinfoex4 указывает на заполненную структуру адресов сокета, длина которой указана в элементе ai_addrlen .
Примеры
В следующем коде описывается вызов GetAddrInfoEx со структурой addrinfoex4 для получения дескриптора полного доменного имени. Затем в примере вызовите WSAIoctl со структурой ASSOCIATE_NAMERES_CONTEXT_INPUT .
//
// Connect to a server using its IPv4 addresses
//
VOID
ConnectServer(
PCWSTR server)
{
int iResult;
PADDRINFOEX4 pResult = NULL;
ADDRINFOEX3 hints = { 0 };
PADDRINFOEX4 pCur = NULL;
WSADATA wsaData;
SOCKET connectSocket = INVALID_SOCKET;
ULONG bytesReturned = 0;
ASSOCIATE_NAMERES_CONTEXT_INPUT input = { 0 };
SOCKADDR_IN clientService;
wchar_t ipstringbuffer[46];
String string;
DWORD dwRetval;
//
// Initialize Winsock
//
iResult = WSAStartup(
MAKEWORD(2, 2),
&wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
goto Exit;
}
//
// Create a SOCKET for connection
//
connectSocket = socket(
AF_UNSPEC,
SOCK_STREAM,
IPPROTO_TCP);
if (connectSocket == INVALID_SOCKET)
{
printf("socket failed: %d\n", WSAGetLastError());
goto Exit;
}
//
// Do name resolution
//
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_EXTENDED | AI_FQDN | AI_CANONNAME | AI_RESOLUTION_HANDLE;
hints.ai_version = ADDRINFOEX_VERSION_4;
dwRetval = GetAddrInfoExW(
server,
NULL,
NS_DNS,
NULL,
(const ADDRINFOEXW*)&hints,
(PADDRINFOEXW*)&pResult,
NULL,
NULL,
NULL, NULL);
if (dwRetval != 0) {
printf("GetAddrInfoEx failed with error: %d\n", dwRetval);
goto Exit;
}
input.TransportSettingId.Guid = ASSOCIATE_NAMERES_CONTEXT;
input.Handle = pResult->ai_resolutionhandle;
//
// Associate socket with the handle
//
if (WSAIoctl(
connectSocket,
SIO_APPLY_TRANSPORT_SETTING,
(VOID *)&input,
sizeof(input),
NULL,
0,
&bytesReturned,
NULL,
NULL) == SOCKET_ERROR)
if (iResult != 0){
printf("WSAIoctl failed: %d\n", WSAGetLastError());
goto Exit;
}
//
// Connect to server
//
pCur = pResult;
while (pCur != NULL)
{
if (pCur->ai_addr->sa_family == AF_INET)
{
clientService = *(const sockaddr_in*)pCur->ai_addr;
clientService.sin_port = htons(80);
if (connect(
connectSocket,
(const SOCKADDR *)&clientService,
sizeof(clientService)) == SOCKET_ERROR)
{
printf("connect failed: %d\n", WSAGetLastError());
goto Exit;
}
}
pCur = pCur->ai_next;
}
Exit:
if (connectSocket != INVALID_SOCKET)
{
closesocket(connectSocket);
}
if (pResult)
{
FreeAddrInfoExW((ADDRINFOEXW*)pResult);
}
WSACleanup();
return;
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 10 [только классические приложения] |
Минимальная версия сервера | Windows Server 2016 [только классические приложения] |
Верхняя часть | ws2def.h |