Функция setsockopt (winsock.h)
Функция setsockopt задает параметр сокета.
Синтаксис
int setsockopt(
[in] SOCKET s,
[in] int level,
[in] int optname,
[in] const char *optval,
[in] int optlen
);
Параметры
[in] s
Дескриптор, идентифицирующий сокет.
[in] level
Уровень, на котором определен параметр (например, SOL_SOCKET).
[in] optname
Параметр сокета, для которого необходимо задать значение (например, SO_BROADCAST). Параметр optname должен быть параметром сокета, определенным в пределах указанного уровня, иначе поведение не определено.
[in] optval
Указатель на буфер, в котором указано значение запрошенного параметра.
[in] optlen
Размер (в байтах) буфера, на который указывает параметр optval .
Возвращаемое значение
Если ошибка не возникает, функция setsockopt возвращает ноль. В противном случае возвращается значение SOCKET_ERROR, а определенный код ошибки можно получить, вызвав WSAGetLastError.
Код ошибки | Значение |
---|---|
Перед использованием этой функции должен быть выполнен успешный вызов WSAStartup . | |
Произошел сбой сетевой подсистемы. | |
Буфер, на который указывает параметр optval , не находится в допустимой части адресного пространства процесса или параметр optlen слишком мал. | |
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
Недопустимый параметр level или недопустимые сведения в буфере, на который указывает параметр optval . | |
Истекло время ожидания подключения, когда задано SO_KEEPALIVE . | |
Параметр неизвестен или не поддерживается для указанного поставщика или сокета (см. SO_GROUP_PRIORITY ограничения). | |
Подключение сбрасывается при установке SO_KEEPALIVE . | |
Дескриптор не является сокетом. |
Комментарии
Функция setsockopt задает текущее значение параметра сокета, связанного с сокетом любого типа в любом состоянии. Хотя параметры могут существовать на нескольких уровнях протокола, они всегда присутствуют на верхнем уровне сокета. Параметры влияют на операции сокета, такие как получение ускоряемых данных (например, данных OOB) в обычном потоке данных и возможность отправки широковещательных сообщений в сокет.
sizeof(int)
для логических параметров. Для других параметров optval указывает на целое число или структуру, которая содержит нужное значение для параметра, а optlen — это длина целого числа или структуры.
В следующих таблицах перечислены некоторые распространенные параметры, поддерживаемые функцией setsockopt . Столбец Тип определяет тип данных, к которым обращается параметр optval . В столбце Описание содержатся некоторые основные сведения о параметре сокета. Более полные списки параметров сокета и более подробные сведения (например, значения по умолчанию) см. в разделе Параметры сокета.
Уровень = SOL_SOCKET
Значение | Тип | Описание |
---|---|---|
SO_BROADCAST | BOOL | Настраивает сокет для отправки широковещательных данных. |
SO_CONDITIONAL_ACCEPT | BOOL | Позволяет принимать или отклонять входящие подключения приложением, а не стеком протоколов. |
SO_DEBUG | BOOL | Включает выходные данные отладки. Поставщики Майкрософт в настоящее время не выводить отладочную информацию. |
SO_DONTLINGER | BOOL | Не блокирует закрытие ожидания отправки неотправленных данных. Установка этого параметра эквивалентна настройке SO_LINGER с l_onoff равным нулю. |
SO_DONTROUTE | BOOL | Задает, следует ли отправлять исходящие данные в интерфейсе, к которому привязан сокет, а не в каком-то другом интерфейсе. Этот параметр не поддерживается в сокетах ATM (это приводит к ошибке). |
SO_GROUP_PRIORITY | INT | Зарезервировано. |
SO_KEEPALIVE | BOOL | Позволяет отправлять пакеты проверки активности для подключения к сокету. Не поддерживается в сокетах ATM (приводит к ошибке). |
SO_LINGER | ЗАДЕРЖИВАТЬСЯ | Задерживается при закрытии при наличии неотправленных данных. |
SO_OOBINLINE | BOOL | Указывает, что данные, не связанные с привязкой, должны возвращаться в соответствии с обычными данными. Этот параметр действителен только для протоколов, ориентированных на подключение, которые поддерживают внеполосные данные. Обсуждение этой темы см. в разделе Протокольные независимые внеполосные данные. |
SO_RCVBUF | INT | Задает общий размер буферного пространства сокета, которое зарезервировано для приема. |
SO_REUSEADDR | BOOL | Позволяет ограничить сокет, разрешив только тот адрес, который уже используется. Дополнительные сведения см. в разделе Bind. Неприменимо к сокетам ATM. |
SO_EXCLUSIVEADDRUSE | BOOL | Включает для сокета ограничение на монопольный доступ. Права администратора не требуются. |
SO_RCVTIMEO | DWORD | Задает время ожидания (в миллисекундах) для блокировки вызовов приема. |
SO_SNDBUF | INT | Задает общий размер буферного пространства сокета, которое зарезервировано для отправки. |
SO_SNDTIMEO | DWORD | Время ожидания (в миллисекундах) для блокировки вызовов отправки. |
SO_UPDATE_ACCEPT_CONTEXT | INT | Обновления принимающего сокета контекстом сокета прослушивания. |
PVD_CONFIG | Зависимость от поставщика услуг | Этот объект хранит сведения о конфигурации для поставщика служб, связанного с сокетами. Точный формат этой структуры данных зависит от поставщика услуг. |
Уровень = IPPROTO_TCP
См . TCP_NODELAY в IPPROTO_TCP параметрах сокета. Более полные и подробные сведения о параметрах сокетов для IPPROTO_TCP уровня = см. в этом разделе.
Уровень = NSPROTO_IPX
Значение | Тип | Описание |
---|---|---|
IPX_PTYPE | INT | Задает тип пакета IPX. |
IPX_FILTERPTYPE | INT | Задает тип пакета фильтра получения |
IPX_STOPFILTERPTYPE | INT | Прекращает фильтрацию типа фильтра, заданного с помощью IPX_FILTERTYPE |
IPX_DSTYPE | INT | Задает значение поля потока данных в заголовке SPX для каждого отправленного пакета. |
IPX_EXTENDED_ADDRESS | BOOL | Задает, включена ли расширенная адресация. |
IPX_RECVHDR | BOOL | Задает, отправляется ли заголовок протокола во все заголовки приема. |
IPX_RECEIVE_BROADCAST | BOOL | Указывает, что широковещательные пакеты, скорее всего, находятся в сокете. По умолчанию задайте значение TRUE . Приложения, которые не используют широковещательные трансляции, должны установить для этого параметра значение FALSE для повышения производительности системы. |
IPX_IMMEDIATESPXACK | BOOL | Направляет подключения SPX не задерживать перед отправкой ACK. Приложения без обратного и обратного трафика должны установить для этого параметра значение TRUE , чтобы повысить производительность. |
Более полные и подробные сведения о параметрах сокетов дляNSPROTO_IPXуровня = см. в разделе параметры сокета NSPROTO_IPX.
Параметры BSD, не поддерживаемые для setsockopt , показаны в следующей таблице.
Значение | Тип | Описание |
---|---|---|
SO_ACCEPTCONN | BOOL | Возвращает значение, указывающее, находится ли сокет в режиме прослушивания. Этот параметр действителен только для протоколов, ориентированных на подключение. Этот параметр сокета не поддерживается для параметра . |
SO_RCVLOWAT | INT | Параметр сокета из BSD UNIX, входящий в состав для обеспечения обратной совместимости. Этот параметр задает минимальное количество байтов, обрабатываемых для операций ввода сокета. |
SO_SNDLOWAT | INT | Параметр сокета из BSD UNIX, входящий в состав для обеспечения обратной совместимости. Этот параметр задает минимальное количество байтов, обрабатываемых для операций вывода сокета. |
SO_TYPE | INT | Возвращает тип сокета для заданного сокета (SOCK_STREAM или SOCK_DGRAM, например этот параметр не поддерживается для параметра типа сокета. |
Пример кода
В следующем примере показана функция setsockopt .#ifndef UNICODE
#define UNICODE
#endif
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
int main()
{
//---------------------------------------
// Declare variables
WSADATA wsaData;
SOCKET ListenSocket;
sockaddr_in service;
int iResult = 0;
BOOL bOptVal = FALSE;
int bOptLen = sizeof (BOOL);
int iOptVal = 0;
int iOptLen = sizeof (int);
//---------------------------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"Error at WSAStartup()\n");
return 1;
}
//---------------------------------------
// Create a listening socket
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
wprintf(L"socket function failed with error: %u\n", WSAGetLastError());
WSACleanup();
return 1;
}
//---------------------------------------
// 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);
iResult = bind(ListenSocket, (SOCKADDR *) & service, sizeof (service));
if (iResult == SOCKET_ERROR) {
wprintf(L"bind failed with error %u\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
//---------------------------------------
// Initialize variables and call setsockopt.
// The SO_KEEPALIVE parameter is a socket option
// that makes the socket send keepalive messages
// on the session. The SO_KEEPALIVE socket option
// requires a boolean value to be passed to the
// setsockopt function. If TRUE, the socket is
// configured to send keepalive messages, if FALSE
// the socket configured to NOT send keepalive messages.
// This section of code tests the setsockopt function
// by checking the status of SO_KEEPALIVE on the socket
// using the getsockopt function.
bOptVal = TRUE;
iResult = getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &iOptVal, &iOptLen);
if (iResult == SOCKET_ERROR) {
wprintf(L"getsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
} else
wprintf(L"SO_KEEPALIVE Value: %ld\n", iOptVal);
iResult = setsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &bOptVal, bOptLen);
if (iResult == SOCKET_ERROR) {
wprintf(L"setsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
} else
wprintf(L"Set SO_KEEPALIVE: ON\n");
iResult = getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &iOptVal, &iOptLen);
if (iResult == SOCKET_ERROR) {
wprintf(L"getsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
} else
wprintf(L"SO_KEEPALIVE Value: %ld\n", iOptVal);
closesocket(ListenSocket);
WSACleanup();
return 0;
}
Заметки о сокетах IrDA
При разработке приложений, использующих сокеты Windows для IrDA, обратите внимание на следующее:
- Файл заголовка Af_irda.h должен быть явно включен.
- IrDA предоставляет следующий вариант сокета:
Значение Тип Значение IRLMP_IAS_SET *IAS_SET Задает атрибуты IAS
Параметр сокета IRLMP_IAS_SET позволяет приложению задать один атрибут одного класса в локальном IAS. Приложение задает класс для задания, атрибут и тип атрибута. Ожидается, что приложение выделит буфер необходимого размера для переданных параметров.
IrDA предоставляет базу данных IAS, в котором хранятся сведения на основе IrDA. Ограниченный доступ к базе данных IAS предоставляется через интерфейс Windows Sockets 2, но такой доступ обычно не используется приложениями и в основном поддерживает подключения к устройствам, не поддерживающим Windows, которые не соответствуют соглашениям IrDA windows Sockets 2.
Следующая структура, IAS_SET, используется с параметром IRLMP_IAS_SET setsockopt для управления локальной базой данных IAS:
// #include <Af_irda.h> for this struct
typedef struct _IAS_SET {
u_char irdaClassName[IAS_MAX_CLASSNAME];
char irdaAttribName[IAS_MAX_ATTRIBNAME];
u_long irdaAttribType;
union
{
LONG irdaAttribInt;
struct
{
u_long Len;
u_char OctetSeq[IAS_MAX_OCTET_STRING];
} irdaAttribOctetSeq;
struct
{
u_long Len;
u_long CharSet;
u_char UsrStr[IAS_MAX_USER_STRING];
} irdaAttribUsrStr;
} irdaAttribute;
} IAS_SET, *PIAS_SET, FAR *LPIASSET;
Следующая структура, IAS_QUERY, используется с параметром IRLMP_IAS_QUERY setsockopt для запроса одноранговой базы данных IAS:
// #include <Af_irda.h> for this struct
typedef struct _WINDOWS_IAS_QUERY {
u_char irdaDeviceID[4];
char irdaClassName[IAS_MAX_CLASSNAME];
char irdaAttribName[IAS_MAX_ATTRIBNAME];
u_long irdaAttribType;
union
{
LONG irdaAttribInt;
struct
{
u_long Len;
u_char OctetSeq[IAS_MAX_OCTET_STRING];
} irdaAttribOctetSeq;
struct
{
u_long Len;
u_long CharSet;
u_char UsrStr[IAS_MAX_USER_STRING];
} irdaAttribUsrStr;
} irdaAttribute;
} IAS_QUERY, *PIAS_QUERY, FAR *LPIASQUERY;
Многие параметры сокетов уровня SO_ не имеют значения для IrDA. Специально поддерживается только SO_LINGER.
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 |