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


Код элемента управления SIO_ADDRESS_LIST_QUERY

Описание

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

Для выполнения этой операции вызовите функцию WSAIoctl или WSPIoctl со следующими параметрами.

int WSAIoctl(
  (socket) s,            // descriptor identifying a socket
  SIO_ADDRESS_LIST_QUERY,            // dwIoControlCode
  NULL,                              // lpvInBuffer
  0,                                 // cbInBuffer
  (LPVOID) lpvOutBuffer,          // output buffer
  (DWORD) cbOutBuffer,            // size of output buffer  
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
);
int WSPIoctl(
  (socket) s,            // descriptor identifying a socket
  SIO_ADDRESS_LIST_QUERY,            // dwIoControlCode
  NULL,                              // lpvInBuffer
  0,                                 // cbInBuffer
  (LPVOID) lpvOutBuffer,          // output buffer
  (DWORD) cbOutBuffer,            // size of output buffer  
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
  (LPWSATHREADID) lpThreadId,   // a WSATHREADID structure
  (LPINT) lpErrno   // a pointer to the error code.
);

Параметры

s

Дескриптор, определяющий сокет.

dwIoControlCode

Код элемента управления для операции. Используйте SIO_ADDRESS_LIST_QUERY для этой операции.

lpvInBuffer

Указатель на входной буфер. Этот параметр не используется для данной операции.

cbInBuffer

Размер входного буфера в байтах. Этот параметр не используется для данной операции.

lpvOutBuffer

Указатель на выходной буфер.

cbOutBuffer

Размер выходного буфера в байтах.

lpcbBytesReturned

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

lpvOverlapped

Указатель на структуру WSAOVERLAPPED .

Если сокеты были созданы без перекрываемого атрибута, параметр lpOverlapped игнорируется.

Если объект был открыт с перекрывающимся атрибутом, а параметр lpOverlapped не равен NULL, операция выполняется как перекрываемая (асинхронная) операция. В этом случае параметр lpOverlapped должен указывать на допустимую структуру WSAOVERLAPPED .

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

lpCompletionRoutine

Тип: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Указатель на подпрограмму завершения, вызываемую при завершении операции (игнорируется для неперекрывающихся сокетов).

lpThreadId

Указатель на структуру WSATHREADID , которая будет использоваться поставщиком в последующем вызове WPUQueueApc. Поставщик должен хранить указанную структуру WSATHREADID (не указатель на нее), пока не будет возвращена функция WPUQueueApc .

Примечание Этот параметр применяется только к функции WSPIoctl .

lpErrno

Указатель на код ошибки.

Примечание Этот параметр применяется только к функции WSPIoctl .

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

Если операция завершается успешно, функция WSAIoctl или WSPIoctl возвращает ноль.

Если операция завершается сбоем или находится в состоянии ожидания, функция WSAIoctl или WSPIoctl возвращает SOCKET_ERROR. Чтобы получить расширенные сведения об ошибке, вызовите WSAGetLastError.

Код ошибки Значение
WSA_IO_PENDING Перекрываемая операция была успешно инициирована, и ее завершение будет указано позже.
WSA_OPERATION_ABORTED Перекрываемая операция была отменена из-за закрытия сокета или выполнения команды IOCTL SIO_FLUSH .
WSAEFAULT Параметр lpOverlapped или lpCompletionRoutine не полностью содержится в допустимой части адресного пространства пользователя.
WSAEINPROGRESS Функция вызывается при выполнении обратного вызова.
WSAEINTR Блокирующая операция была прервана.
WSAEINVAL Параметр dwIoControlCode не является допустимой командой, или указанный входной параметр недопустим, либо команда не применима к указанному типу сокета. Эта ошибка возвращается, если для параметра cbInBuffer не задано значение NULL.
WSAENETDOWN Произошел сбой сетевой подсистемы.
WSAENOBUFS Свободное буферное пространство отсутствует.
WSAENOPROTOOPT Параметр сокета не поддерживается в указанном протоколе.
WSAENOTSOCK Дескриптор не является сокетом.
WSAEOPNOTSUPP Указанная команда IOCTL не поддерживается. Эта ошибка возвращается, если поставщик транспорта не поддерживает SIO_ADDRESS_LIST_QUERY IOCTL.

Комментарии

IOCTL SIO_ADDRESS_LIST_QUERY поддерживается в Windows 2000 и более поздних версиях операционной системы.

Код элемента управления SIO_ADDRESS_LIST_QUERY получает список локальных транспортных адресов семейства протоколов сокета, к которым может привязаться приложение. Список адресов зависит от семейства адресов.

Для семейства адресов AF_INET6 возвращаются все адреса, кроме следующих:

  • Любой IP-адрес, где состояние обнаружения повторяющихся адресов (DAD) не ipDadStatePreferred.
  • Любой IP-адрес с уровнем область ниже ScopeLevelSubnet в интерфейсе, где тип интерфейса IF_TYPE_SOFTWARE_LOOPBACK. Это означает, что локальные адреса ссылок (fe80:*) и замыкания на себя (::1) в интерфейсах IF_TYPE_SOFTWARE_LOOPBACK типа исключаются, но не в том случае, если эти адреса находятся в интерфейсе с другим типом.

Для семейства адресов AF_INET возвращаются все адреса, за исключением следующих:

  • Любой IP-адрес, где состояние обнаружения повторяющихся адресов (DAD) не ipDadStatePreferred.
  • Любой IP-адрес в интерфейсе, где тип интерфейса IF_TYPE_SOFTWARE_LOOPBACK и ссылка является локальной. Это означает, что локальные (169.254.) и замыкания на себя (127.) адреса в интерфейсах IF_TYPE_SOFTWARE_LOOPBACK типа исключаются, но не в том случае, если эти адреса находятся в интерфейсе с другим типом.

Дополнительные сведения о состоянии DAD см. в документации по IP-помощнику по перечислению IP_DAD_STATE и структуре IP_ADAPTER_UNICAST_ADDRESS , а также в документации по MIB по структуре MIB_UNICASTIPADDRESS_ROW . Дополнительные сведения о типе интерфейса см. в документации по вспомогательному ip-адресу по структуре IP_ADAPTER_ADDRESSES и функции GetAdaptersAddresses и документации по MIB по структуре MIB_IF_ROW2 . Дополнительные сведения об уровне область см. в документации по вспомогательному ip-адресу по структуре IP_ADAPTER_ADDRESSES и перечислению SCOPE_LEVEL.

Список, возвращаемый в выходном буфере, на который указывает параметр lpvOutBuffer , имеет форму структуры SOCKET_ADDRESS_LIST .

Если выходной буфер, указанный в параметре lpvOutBuffer , недостаточно велик, чтобы содержать список адресов, SOCKET_ERROR возвращается в результате этого IOCTL, а WSAGetLastError возвращает WSAEFAULT. Требуемый размер в байтах для выходного буфера возвращается в параметре lpcbBytesReturned в этом случае. Обратите внимание, что код ошибки WSAEFAULT также возвращается, если параметр lpvInBuffer, lpvOutBuffer или lpcbBytesReturned не полностью содержится в допустимой части адресного пространства пользователя.

Обычно SIO_ADDRESS_LIST_QUERY IOCTL вызывается синхронно с параметром lpvOverlapped со значением NULL, так как список адресов возвращается немедленно.

Примечание В средах Windows Plug-n-Play адреса можно добавлять и удалять динамически. Поэтому приложения не могут полагаться на сведения, возвращаемые SIO_ADDRESS_LIST_QUERY , быть постоянными. Приложения могут регистрироваться для получения уведомлений об изменении адреса через SIO_ADDRESS_LIST_CHANGE IOCTL, который предоставляет уведомления через перекрывающиеся операции ввода-вывода или события FD_ADDRESS_LIST_CHANGE . Следующую последовательность действий можно использовать, чтобы гарантировать, что приложение всегда имеет текущие сведения о списке адресов:

  • Выдача SIO_ADDRESS_LIST_CHANGE IOCTL
  • Выдача SIO_ADDRESS_LIST_QUERY IOCTL
  • Каждый раз, когда вызов IOCTL SIO_ADDRESS_LIST_CHANGE уведомляет об изменении списка адресов (путем перекрытия операций ввода-вывода или сигнала FD_ADDRESS_LIST_CHANGE события), следует повторять всю последовательность действий.

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

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

GetAdaptersAddresses

IP_ADAPTER_ADDRESSES

IP_ADAPTER_UNICAST_ADDRESS

IP_DAD_STATE

MIB_IF_ROW2

MIB_UNICASTIPADDRESS_ROW

SCOPE_LEVEL

SOCKET_ADDRESS_LIST

Сокета

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW