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

Функция getsockopt извлекает параметр сокета.

Синтаксис

int getsockopt(
  [in]      SOCKET s,
  [in]      int    level,
  [in]      int    optname,
  [out]     char   *optval,
  [in, out] int    *optlen
);

Параметры

[in] s

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

[in] level

Уровень, на котором определен параметр. Пример : SOL_SOCKET.

[in] optname

Параметр сокета, для которого требуется извлечь значение. Пример : SO_ACCEPTCONN. Значение optname должно быть параметром сокета, определенным в пределах указанного уровня, иначе поведение не определено.

[out] optval

Указатель на буфер, в котором возвращается значение запрошенного параметра.

[in, out] optlen

Указатель на размер буфера optval в байтах.

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

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

Код ошибки Значение
WSANOTINITIALISED
Перед использованием этой функции должен быть выполнен успешный вызов WSAStartup .
WSAENETDOWN
Примечание Произошел сбой сетевой подсистемы.
 
WSAEFAULT
Один из параметров optval или optlen не является допустимой частью адресного пространства пользователя или параметр optlen слишком мал.
WSAEINPROGRESS
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAEINVAL
Параметр level неизвестен или недопустим.
WSAENOPROTOOPT
Параметр неизвестен или не поддерживается указанным семейством протоколов.
WSAENOTSOCK
Дескриптор не является сокетом.

Комментарии

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

Значение, связанное с выбранным параметром, возвращается в буфере optval. Целое число, на который указывает optlen , должно изначально содержать размер этого буфера; при возврате ему будет задан размер возвращаемого значения. Для SO_LINGER это будет размер структуры LINGER . Для большинства других параметров это будет размер целого числа.

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

Если параметр никогда не устанавливался с помощью setsockopt, функция getsockopt возвращает значение по умолчанию для параметра .

Для getsockopt поддерживаются следующие параметры. Столбец Тип определяет тип данных, к которым обращается optval.

Дополнительные сведения о параметрах сокета см. в разделе Параметры сокета.

Следующая таблица значений для параметра optname допустима, если параметру level присвоено значение SOL_SOCKET.

Значение Тип Значение
SO_ACCEPTCONN BOOL Сокет прослушивает.
SO_BROADCAST BOOL Сокет настраивается для передачи и получения широковещательных сообщений.
SO_BSP_STATE CSADDR_INFO Возвращает локальный адрес, локальный порт, удаленный адрес, удаленный порт, тип сокета и протокол, используемый сокетом.
SO_CONDITIONAL_ACCEPT BOOL Возвращает текущее состояние сокета из предыдущего вызова метода setsockopt или системного значения по умолчанию.
SO_CONNECT_TIME DWORD Возвращает количество секунд, в течение которых сокет был подключен. Этот параметр сокета допустим только для протоколов, ориентированных на подключение.
SO_DEBUG BOOL Отладка включена.
SO_DONTLINGER BOOL Если задано значение TRUE, параметр SO_LINGER отключен.
SO_DONTROUTE BOOL Маршрутизация отключена. Установка этого параметра выполняется успешно, но игнорируется в сокетах AF_INET; сбой в сокетах AF_INET6 с WSAENOPROTOOPT. Этот параметр не поддерживается в сокетах ATM.
SO_ERROR INT Извлекает состояние ошибки и очищает его.
SO_EXCLUSIVEADDRUSE BOOL Предотвращает привязку любого другого сокета к тому же адресу и порту. Этот параметр необходимо задать перед вызовом функции bind .
SO_GROUP_ID GROUP Зарезервировано.
SO_GROUP_PRIORITY INT Зарезервировано.
SO_KEEPALIVE BOOL Оставить живых посылают. Не поддерживается в сокетах ATM.
SO_LINGER Структура LINGER Возвращает текущие параметры задерживающегося объекта.
SO_MAX_MSG_SIZE unsigned int Максимальный размер сообщения для типов сокетов, ориентированных на сообщения (например, SOCK_DGRAM). Не имеет значения для сокетов, ориентированных на поток.
SO_OOBINLINE BOOL Данные OOB принимаются в обычном потоке данных. (См. раздел Windows Sockets 1.1 Blocking Routines and EINPROGRESS для обсуждения этой темы.)
SO_PORT_SCALABILITY BOOL Обеспечивает масштабируемость локальных портов для сокета, позволяя максимально увеличить выделение портов, выделяя порты с подстановочными знаками несколько раз для разных пар портов локальных адресов на локальном компьютере.
SO_PROTOCOL_INFO WSAPROTOCOL_INFO Описание сведений о протоколе для протокола, привязанного к этому сокету.
SO_RCVBUF INT Общее пространство буфера для каждого сокета, зарезервированное для приемов. Это не связано с SO_MAX_MSG_SIZE и не обязательно соответствует размеру окна получения TCP.
SO_REUSEADDR BOOL Сокет можно привязать к уже используемому адресу. Неприменимо для сокетов ATM.
SO_SNDBUF INT Общее пространство буфера для каждого сокета, зарезервированное для отправки. Это не связано с SO_MAX_MSG_SIZE и не обязательно соответствует размеру окна отправки TCP.
SO_TYPE INT Тип сокета (например, SOCK_STREAM).
PVD_CONFIG Зависимость от поставщика услуг Непрозрачный объект структуры данных от поставщика службы, связанного с сокетами. Этот объект хранит сведения о текущей конфигурации поставщика услуг. Точный формат этой структуры данных зависит от поставщика услуг.
 

Уровень = IPPROTO_TCP

См . TCP_NODELAY в IPPROTO_TCP параметрах сокета. Более полные и подробные сведения о параметрах сокетов для IPPROTO_TCP уровня = см. в этом разделе.  

Следующая таблица значений для параметра optname допустима, если для параметра level задано значение NSPROTO_IPX.

Примечание Windows NT поддерживает все параметры IPX. Windows Me, Windows 98 и Windows 95 поддерживают только следующие параметры:
IPX_PTYPE
IPX_FILTERPTYPE
IPX_DSTYPE
IPX_RECVHDR
IPX_MAXSIZE
IPX_ADDRESS
 
Значение Тип Значение
IPX_PTYPE INT Извлекает тип пакета IPX.
IPX_FILTERPTYPE INT Извлекает тип пакета фильтра получения.
IPX_DSTYPE INT Получает значение поля потока данных в заголовке SPX для каждого отправленного пакета.
IPX_EXTENDED_ADDRESS BOOL Определяет, включена ли расширенная адресация.
IPX_RECVHDR BOOL Определяет, отправляется ли заголовок протокола во всех заголовках приема.
IPX_MAXSIZE INT Получает максимальный размер данных, которые можно отправить.
IPX_ADDRESS структура IPX_ADDRESS_DATA Получает сведения о конкретном адаптере, к которому привязан IPX. Нумеровка адаптера равна нулю. Член adapternum заполняется при возврате.
IPX_GETNETINFO структура IPX_NETNUM_DATA Получает сведения об определенном сетевом номере IPX. Если он недоступен в кэше, использует RIP для получения сведений.
IPX_GETNETINFO_NORIP структура IPX_NETNUM_DATA Получает сведения об определенном сетевом номере IPX. Если он недоступен в кэше, не будет использовать RIP для получения сведений и возвращает ошибку.
IPX_SPXGETCONNECTIONSTATUS структура IPX_SPXCONNSTATUS_DATA Извлекает сведения о подключенном сокете SPX.
IPX_ADDRESS_NOTIFY структура IPX_ADDRESS_DATA Получает уведомление о состоянии при изменении адаптера, к которому привязан IPX.
IPX_MAX_ADAPTER_NUM INT Извлекает максимальное число присутствующих адаптеров, нумеруемых как базовый нуль.
IPX_RERIPNETNUMBER структура IPX_NETNUM_DATA Аналогично IPX_GETNETINFO, но заставляет IPX использовать RIP для разрешения, даже если сведения о сети содержатся в локальном кэше.
IPX_IMMEDIATESPXACK BOOL Направляет подключения SPX не задерживать перед отправкой ACK. Приложения без обратного и обратного трафика должны установить для этого параметра значение TRUE , чтобы повысить производительность.
TCP_MAXSEG INT Получает максимальный размер сегмента TCP. Поддерживается в Windows 10 и более поздних версиях.
 

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

Значение Тип Значение
SO_RCVLOWAT INT Получает низкий водяной знак.
SO_RCVTIMEO INT Получает время ожидания.
SO_SNDLOWAT INT Отправляет низкий водяной знак.
SO_SNDTIMEO INT Отправляет время ожидания.
TCP_MAXSEG INT Получает максимальный размер сегмента TCP. Не поддерживается в версиях до Windows 10.
 
Примечание Если при использовании функции recv данные не поступают в течение периода, указанного в SO_RCVTIMEO, функция recv завершается. В версиях Windows, предшествующих Windows 2000, все полученные данные впоследствии завершаются ошибкой WSAETIMEDOUT. В Windows 2000 и более поздних версиях, если данные не поступают в течение периода, указанного в SO_RCVTIMEO, функция recv возвращает WSAETIMEDOUT, а если данные получены, recv возвращает success.
 

Вызов getockopt с неподдерживаемым параметром приведет к возврату кода ошибки WSAENOPROTOOPT из WSAGetLastError.

Ниже приведены более подробные сведения о некоторых параметрах сокета optname , поддерживаемых функцией getsockopt .

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

Параметр SO_CONNECT_TIME можно использовать с функцией getsockopt, чтобы проверка, установлено ли соединение. Этот параметр также можно использовать во время вызова функции ConnectEx . Если подключение установлено, параметр SO_CONNECT_TIME может определить, как долго оно установлено. Если сокет не подключен, метод getsockopt возвращает SOCKET_ERROR. Проверка такого подключения необходима, чтобы узнать, установлены ли соединения, которые были установлены на некоторое время, без отправки каких-либо данных. Рекомендуется, чтобы приложения завершают эти подключения.

SO_DEBUG
Примечание Поставщикам служб Сокетов Windows рекомендуется (но не обязательно) предоставлять выходные отладочные сведения, если параметр SO_DEBUG задан приложением. Механизм создания отладочной информации и форма, которую он принимает, выходит за рамки область этого документа.
 
SO_ERROR
Параметр SO_ERROR возвращает и сбрасывает код ошибки на основе сокета, который отличается от кода ошибки на основе потока, который обрабатывается с помощью вызовов функций WSAGetLastError и WSASetLastError . Успешный вызов с использованием сокета не сбрасывает код ошибки на основе сокета, возвращаемый параметром SO_ERROR.
SO_EXCLUSIVEADDRUSE
Предотвращает привязку любого другого сокета к тому же адресу и порту. Этот параметр необходимо задать перед вызовом функции bind . Дополнительные сведения см. в справочнике по SO_EXCLUSIVEADDRUSE .
SO_GROUP_ID
Примечание Этот параметр зарезервирован. Этот параметр также является эксклюзивным для getsockopt; значение должно иметь значение NULL.
 
SO_GROUP_PRIORITY
Этот параметр зарезервирован. Приоритет группы указывает приоритет указанного сокета относительно других сокетов в группе сокетов. Значения являются неотрицательными целыми числами, ноль которых соответствует наивысшему приоритету. Значения приоритета представляют базовому поставщику услуг подсказку о том, как следует выделять потенциально ограниченные ресурсы. Например, всякий раз, когда два или более сокета готовы к передаче данных, сначала следует обслуживать сокет с наивысшим приоритетом (наименьшее значение для SO_GROUP_PRIORITY), а остальные по очереди обслуживаются в соответствии с их относительными приоритетами.

Код ошибки WSAENOPROTOOPT указан для негрупповых сокетов или поставщиков служб, которые не поддерживают групповые сокеты.

SO_KEEPALIVE
Приложение может запросить, чтобы поставщик службы TCP/IP включил использование пакетов поддержки активности в TCP-подключениях, включив параметр сокета SO_KEEPALIVE. Этот параметр запрашивает текущее значение параметра keep-alive в сокете. Поставщику сокетов Windows не нужно поддерживать использование функции поддержания активности: если это так, точная семантика зависит от реализации, но должна соответствовать разделу 4.2.3.6 в разделе Требования к узлам Интернета — уровни связи , указанные в RFC 1122, доступной на веб-сайте IETF. Если подключение будет удалено в результате операций поддержания активности, код ошибки WSAENETRESET возвращается во все вызовы, которые выполняются в сокете, и все последующие вызовы будут завершатся сбоем с WSAENOTCONN. SO_KEEPALIVE не поддерживается в сокетах ATM, а запросы на включение использования пакетов поддержания активности в сокете ATM приводят к ошибке, возвращаемой сокетом.
SO_LINGER
SO_LINGER управляет действием, выполняемым при постановке неотправленных данных в очередь в сокете и выполнении закрытия . Описание того, как параметры SO_LINGER влияют на семантику closesocket, см. в разделе closesocket. Приложение получает текущее поведение, извлекая структуру LINGER (на которую указывает параметр optval ).
SO_MAX_MSG_SIZE
Это параметр сокета только для получения, который указывает максимальный размер исходящего трафика (отправки) сообщения для типов сокетов, ориентированных на сообщения (например, SOCK_DGRAM), реализованных определенным поставщиком услуг. Он не имеет смысла для сокетов, ориентированных на поток байтов. Нет подготовки, чтобы узнать максимальный размер входящих сообщений.
SO_PROTOCOL_INFO
Это параметр только для получения, который предоставляет структуру WSAPROTOCOL_INFO , связанную с этим сокетом. Дополнительные сведения об этой структуре см. в разделе WSAEnumProtocols .
SO_SNDBUF
Если реализация сокетов Windows поддерживает параметры SO_RCVBUF и SO_SNDBUF, приложение может запрашивать буфер различных размеров (больше или меньше). Вызов метода setsockopt может завершиться успешно, даже если реализация не предоставила всю запрошенную сумму. Приложение должно вызывать эту функцию с тем же параметром, чтобы проверка фактически предоставленный размер буфера.
SO_REUSEADDR
По умолчанию сокет не может быть привязан (см. привязку) к уже используемому локальному адресу. Однако в некоторых случаях может потребоваться повторно использовать адрес таким образом. Так как каждое подключение уникально идентифицируется сочетанием локальных и удаленных адресов, нет проблем с наличием двух сокетов, привязанных к одному и тому же локальному адресу, если удаленные адреса отличаются. Чтобы сообщить поставщику сокетов Windows о том, что привязка к сокету не должна быть запрещена, так как нужный адрес уже используется другим сокетом, приложение должно задать параметр сокета SO_REUSEADDR для сокета перед выдачей привязки. Обратите внимание, что параметр интерпретируется только во время привязки: поэтому ненужно (но безвредно) устанавливать параметр в сокете, который не должен быть привязан к существующему адресу, а установка или сброс параметра после привязки не влияет на этот или любой другой сокет. SO_REUSEADDR неприменимы для сокетов ATM, и хотя запросы на повторное использование и адрес не приводят к ошибке, они не влияют на использование сокета банкомата.
PVD_CONFIG
Этот параметр извлекает непрозрачный объект структуры данных от поставщика услуг, связанного с сокетами. Этот объект хранит сведения о текущей конфигурации поставщика услуг. Точный формат этой структуры данных зависит от поставщика услуг.
TCP_NODELAY
Параметр TCP_NODELAY предназначен для поставщиков служб TCP/IP. Алгоритм Nagle отключен, если включен параметр TCP_NODELAY (и наоборот). Алгоритм Nagle (описанный в RFC 896) очень эффективен для уменьшения количества небольших пакетов, отправляемых узлом. Этот процесс включает в себя буферизацию отправляемых данных при наличии непризнанных данных, которые уже находятся в полете, или буферизации отправляемых данных до тех пор, пока не будет отправлен полноразмерный пакет. Настоятельно рекомендуется, чтобы реализации сокетов Windows включили алгоритм Nagle по умолчанию, так как для подавляющего большинства протоколов приложений алгоритм Nagle может обеспечить значительное повышение производительности. Однако для некоторых приложений этот алгоритм может препятствовать производительности, и для его отключения можно использовать метод setsockopt с тем же параметром. Это приложения, в которых отправляется много небольших сообщений, и сохраняется задержка времени между сообщениями.
Примечание При выполнении блокирующего вызова Winsock, например getsockopt, Winsock может потребоваться дождаться сетевого события, прежде чем вызов сможет завершиться. В этой ситуации Winsock выполняет оповещенное ожидание, которое может быть прервано асинхронным вызовом процедуры (APC), запланированным в том же потоке. Выполнение другого блокирующего вызова Winsock внутри APC, который прервал текущий блокирующий вызов Winsock в том же потоке, приведет к неопределенному поведению и никогда не должен выполняться клиентами Winsock.
 

Пример кода

В следующем примере кода показано использование функции getsockopt .
#include <stdio.h>
#include "winsock2.h"
#include <windows.h>

void main() {

  //---------------------------------------
  // Declare variables
  WSADATA wsaData;
  SOCKET ListenSocket;
  sockaddr_in service;

  //---------------------------------------
  // Initialize Winsock
  int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
  if( iResult != NO_ERROR )
    printf("Error at WSAStartup\n");

  //---------------------------------------
  // Create a listening socket
  ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
  if (ListenSocket == INVALID_SOCKET) {
    printf("Error at socket()\n");
    WSACleanup();
    return;
  }

  //---------------------------------------
  // Bind the socket to the local IP address
  // and port 27015
  hostent* thisHost;
  char* ip;
  u_short port;
  port = 27015;
  thisHost = gethostbyname("");
  ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list);

  service.sin_family = AF_INET;
  service.sin_addr.s_addr = inet_addr(ip);
  service.sin_port = htons(port);
 
  if ( bind( ListenSocket,(SOCKADDR*) &service, sizeof(service) )  == SOCKET_ERROR ) {
    printf("bind failed\n");
    closesocket(ListenSocket);
    return;
  }

  //---------------------------------------
  // Initialize variables and call getsockopt. 
  // The SO_ACCEPTCONN parameter is a socket option 
  // that tells the function to check whether the 
  // socket has been put in listening mode or not. 
  // The various socket options return different
  // information about the socket. This call should
  // return 0 to the optVal parameter, since the socket
  // is not in listening mode.
  int optVal;
  int optLen = sizeof(int);

  if (getsockopt(ListenSocket, 
    SOL_SOCKET, 
    SO_ACCEPTCONN, 
    (char*)&optVal, 
    &optLen) != SOCKET_ERROR)
    printf("SockOpt Value: %ld\n", optVal);

  //---------------------------------------
  // Put the listening socket in listening mode.
  if (listen( ListenSocket, 100 ) == SOCKET_ERROR) {
    printf("error listening\n");
  } 

  //---------------------------------------
  // Call getsockopt again to verify that 
  // the socket is in listening mode.
  if (getsockopt(ListenSocket, 
    SOL_SOCKET, 
    SO_ACCEPTCONN, 
    (char*)&optVal, 
    &optLen) != SOCKET_ERROR)
    printf("SockOpt Value: %ld\n", optVal);

  WSACleanup();
  return;
}

Заметки о сокетах IrDA

  • Файл заголовка Af_irda.h должен быть явно включен.
  • Windows возвращает WSAENETDOWN , чтобы указать, что базовому драйверу приемопередатчику не удалось инициализировать с помощью стека протоколов IrDA.
  • IrDA поддерживает несколько специальных параметров сокетов:
    Значение Тип Значение
    IRLMP_ENUMDEVICES *DEVICELIST Описывает устройства в диапазоне.
    IRLMP_IAS_QUERY *IAS_QUERY Получение атрибутов IAS.
     

Прежде чем можно будет инициировать подключение к сокету IrDA, необходимо получить адрес устройства, выполнив вызов функции getsockopt(,,IRLMP_ENUMDEVICES,), который возвращает список всех доступных устройств IrDA. Адрес устройства, возвращенный вызовом функции, копируется в структуру SOCKADDR_IRDA , которая, в свою очередь, используется при последующем вызове функции connect .

Обнаружение можно выполнить двумя способами:

  1. Во-первых, выполнение вызова функции getsockopt с параметром IRLMP_ENUMDEVICES приводит к выполнению одного обнаружения на каждом адаптере бездействия. Список обнаруженных и кэшированных устройств (на активных адаптерах) возвращается немедленно.

    Этот подход демонстрируется в следующем коде.

    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <af_irda.h>
    #include <stdio.h>
    #include <windows.h>
    
    // link with Ws2_32.lib
    
    int __cdecl main()
    {
    
        //-----------------------------------------
        // Declare and initialize variables
        WSADATA wsaData;
    
        int iResult;
        int i;
        DWORD dwError;
    
        SOCKET Sock = INVALID_SOCKET;
    
    #define DEVICE_LIST_LEN    10
    
    
        SOCKADDR_IRDA DestSockAddr = { AF_IRDA, 0, 0, 0, 0, "SampleIrDAService" };
    
        unsigned char DevListBuff[sizeof (DEVICELIST) -
                                  sizeof (IRDA_DEVICE_INFO) +
                                  (sizeof (IRDA_DEVICE_INFO) * DEVICE_LIST_LEN)];
    
        int DevListLen = sizeof (DevListBuff);
        PDEVICELIST pDevList;
    
        pDevList = (PDEVICELIST) & DevListBuff;
    
        // Initialize Winsock
        iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
        if (iResult != 0) {
            printf("WSAStartup failed: %d\n", iResult);
            return 1;
        }
    
        Sock = socket(AF_IRDA, SOCK_STREAM, 0);
        if (Sock == INVALID_SOCKET) {
            dwError = WSAGetLastError();
            printf
                ("socket failed trying to create an AF_IRDA socket with error %d\n",
                 dwError);
    
            if (dwError == WSAEAFNOSUPPORT) {
                printf("Check that the local computer has an infrared device\n");
                printf
                    ("and a device driver is installed for the infrared device\n");
            }
            WSACleanup();
            return 1;
        }
        // Sock is not in connected state
        iResult = getsockopt(Sock, SOL_IRLMP, IRLMP_ENUMDEVICES,
                             (char *) pDevList, &DevListLen);
        if (iResult == SOCKET_ERROR) {
            printf("getsockopt failed with error %d\n", WSAGetLastError());
            WSACleanup();
            return 1;
        }
    
        if (pDevList->numDevice == 0) {
            // no devices discovered or cached
            // not a bad idea to run a couple of times
            printf("No IRDA devices were discovered or cached\n");
        } else {
            // one per discovered device
            for (i = 0; i < (int) pDevList->numDevice; i++) {
                // typedef struct _IRDA_DEVICE_INFO
                // {
                //     u_char    irdaDeviceID[4];
                //     char      irdaDeviceName[22];
                //     u_char    irdaDeviceHints1;
                //     u_char    irdaDeviceHints2;
                //     u_char    irdaCharSet;
                // } _IRDA_DEVICE_INFO;
    
                // pDevList->Device[i]. see _IRDA_DEVICE_INFO for fields
                // display the device names and let the user select one
            }
        }
    
        // assume the user selected the first device [0]
        memcpy(&DestSockAddr.irdaDeviceID[0], &pDevList->Device[0].irdaDeviceID[0],
               4);
    
        iResult = connect(Sock, (const struct sockaddr *) &DestSockAddr,
                          sizeof (SOCKADDR_IRDA));
        if (iResult == SOCKET_ERROR) {
            printf("connect failed with error %d\n", WSAGetLastError());
        } else
            printf("connect to first IRDA device was successful\n");
    
        WSACleanup();
        return 0;
    }
    
    
  2. Второй подход к обнаружению адресов устройств IrDA заключается в выполнении отложенного обнаружения; При таком подходе приложение не получает уведомления до тех пор, пока список обнаруженных устройств не изменится по сравнению с последним обнаружением, запущенным стеком.
Структура DEVICELIST , показанная в столбце Type в предыдущей таблице, представляет собой расширяемый массив описаний устройств. IrDA заполняет столько описаний устройств, сколько может поместиться в указанном буфере. Описание устройства состоит из идентификатора устройства, необходимого для формирования структуры sockaddr_irda, и отображаемой строки, описывающей устройство.

Структура IAS_QUERY , показанная в столбце Тип в предыдущей таблице, используется для получения одного атрибута одного класса из базы данных IAS однорангового устройства. Приложение указывает устройство и класс для запроса, а также атрибут и тип атрибута. Обратите внимание, что устройство было получено ранее путем вызова метода getsockopt(IRLMP_ENUMDEVICES). Ожидается, что приложение выделяет буфер необходимого размера для возвращаемых параметров.

Многие параметры сокета уровня не имеют значения для IrDA; специально поддерживаются только SO_LINGER и SO_DONTLINGER.

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

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

Требования

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

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

Параметры сокета IPPROTO_IP

Параметры сокета IPPROTO_IPV6

Параметры сокета IPPROTO_RM

Параметры сокета IPPROTO_TCP

Параметры сокета IPPROTO_UDP

Параметры сокета NSPROTO_IPX

Параметры сокета SOL_APPLETALK

Параметры сокета SOL_IRLMP

Параметры сокета SOL_SOCKET

Параметры сокета

WSAsyncSelect

WSAConnect

WSAGetLastError

WSAIoctl

WSASetLastError

Функции Winsock

ioctlsocket

Recv

setsockopt

Сокета