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


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

Функция WSAsyncGetHostByAddr асинхронно извлекает сведения об узле, соответствующие адресу.

Примечание Функция WSAsyncGetHostByAddr не предназначена для параллельного разрешения нескольких адресов. Поэтому приложения, которые выдают несколько запросов, не должны ожидать, что они будут выполняться одновременно. Кроме того, приложения могут запустить другой поток и использовать функцию getnameinfo для разрешения адресов независимо от IP-версии. Разработчикам, создающих приложения Windows Sockets 2, настоятельно рекомендуется использовать функцию getnameinfo , чтобы обеспечить плавный переход к совместимости IPv6.
 

Синтаксис

HANDLE WSAAPI WSAAsyncGetHostByAddr(
  HWND       hWnd,
  u_int      wMsg,
  const char *addr,
  int        len,
  int        type,
  char       *buf,
  int        buflen
);

Параметры

hWnd

TBD

wMsg

TBD

addr

TBD

len

TBD

type

TBD

buf

TBD

buflen

TBD

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

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

Если ошибка не возникает, WSAsyncGetHostByAddr возвращает ненулевое значение типа HANDLE, которое является дескриптором асинхронной задачи (не путать с Windows HTASK) для запроса. Это значение можно использовать двумя способами. Его можно использовать для отмены операции с помощью WSACancelAsyncRequest или для сопоставления асинхронных операций и сообщений завершения путем проверки параметра сообщения wParam .

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

При получении сообщения в окне приложения можно задать следующие коды ошибок. Как описано выше, их можно извлечь из lParam в ответном сообщении с помощью макроса WSAGETASYNCERROR .

Код ошибки Значение
WSAENETDOWN
Произошел сбой сетевой подсистемы.
WSAENOBUFS
Недостаточно места в буфере.
WSAEFAULT
Параметр addr или buf не входит в допустимую часть адресного пространства процесса.
WSAHOST_NOT_FOUND
Достоверный узел ответов не найден.
WSATRY_AGAIN
Неавторизированный узел не найден или SERVERFAIL.
WSANO_RECOVERY
Неустранимые ошибки: FORMERR, REFUSED, NOTIMP.
WSANO_DATA
Допустимое имя, без записи данных запрошенного типа.
 
 

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

Код ошибки Значение
WSANOTINITIALISED Перед использованием этой функции должен произойти успешный вызов WSAStartup .
WSAENETDOWN Произошел сбой сетевой подсистемы.
WSAEINPROGRESS Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAEWOULDBLOCK В настоящее время асинхронную операцию невозможно запланировать из-за ограничений ресурсов или других ограничений в реализации сокетов Windows.

Комментарии

Функция WSAsyncGetHostByAddr является асинхронной версией gethostbyaddr. Он используется для получения имени узла и сведений об адресе, которые соответствуют сетевому адресу. Сокеты Windows инициируют операцию и немедленно возвращаются вызывающей стороне, передавая непрозрачный асинхронный дескриптор задачи, который приложение может использовать для идентификации операции. После завершения операции результаты (если таковые имеются) копируются в буфер, предоставленный вызывающим объектом, и сообщение отправляется в окно приложения.

После завершения асинхронной операции окно приложения, указанное параметром hWnd , получает сообщение в параметре wMsg . Параметр wParam содержит дескриптор асинхронной задачи, возвращенный исходным вызовом функции. Высокие 16 бит lParam содержат любой код ошибки. Код ошибки может быть любой ошибкой, как определено в Winsock2.h. Код ошибки, равный нулю, указывает на успешное завершение асинхронной операции.

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

Если код ошибки — WSAENOBUFS, размер буфера, указанного buflen в исходном вызове, был слишком мал, чтобы содержать все полученные сведения. В этом случае низкие 16 бит lParam содержат размер буфера, необходимый для предоставления всей необходимой информации. Если приложение решит, что частичные данные неадекватны, оно может повторно выполнить вызов функции WSAsyncGetHostByAddr с буфером, достаточно большим для получения всех нужных сведений (т. е. не меньше низких 16 бит lParam).

Буфер, указанный для этой функции, используется windows Sockets для создания структуры вместе с содержимым областей данных, на которые ссылаются члены одной и той же структуры размещения . Чтобы избежать ошибки WSAENOBUFS , приложение должно предоставить буфер не менее байтОВ MAXGETHOSTSTRUCT (как определено в Winsock2.h).

Код ошибки и длина буфера должны быть извлечены из lParam с помощью макросов WSAGETASYNCERROR и WSAGETASYNCBUFLEN, определенных в Winsock2.h как:

#include <windows.h>

#define WSAGETASYNCBUFLEN(lParam)           LOWORD(lParam)
#define WSAGETASYNCERROR(lParam)            HIWORD(lParam)

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

Требования

   
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header winsock2.h (включая Winsock2.h, Winsock.h)
Библиотека Ws2_32.lib
DLL Ws2_32.dll

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

WSACancelAsyncRequest

Функции Winsock

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

getaddrinfo

gethostbyaddr

getnameinfo

hostent