Функция 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.
Код ошибки | Значение |
---|---|
Перед использованием этой функции должен быть выполнен успешный вызов WSAStartup . | |
Примечание Произошел сбой сетевой подсистемы.
|
|
Один из параметров optval или optlen не является допустимой частью адресного пространства пользователя или параметр optlen слишком мал. | |
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
Параметр level неизвестен или недопустим. | |
Параметр неизвестен или не поддерживается указанным семейством протоколов. | |
Дескриптор не является сокетом. |
Комментарии
Функция 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.
- 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. |
Вызов 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 с тем же параметром. Это приложения, в которых отправляется много небольших сообщений, и сохраняется задержка времени между сообщениями.
Пример кода
В следующем примере кода показано использование функции 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 .
Обнаружение можно выполнить двумя способами:
-
Во-первых, выполнение вызова функции 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; }
- Второй подход к обнаружению адресов устройств 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 |