Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Функция 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.
Код ошибки | Meaning |
---|---|
Перед использованием этой функции необходимо выполнить успешный вызов WSAStartup . | |
Сбой сетевой подсистемы. | |
Буфер, на который указывает параметр optval , не находится в допустимой части адресного пространства процесса или параметр optlen слишком мал. | |
Выполняется блокировка вызова сокетов Windows 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
Недопустимый параметр уровня , или сведения в буфере, на которые указывает параметр optval , недопустимы. | |
Время ожидания подключения истекло при установке SO_KEEPALIVE . | |
Параметр неизвестен или не поддерживается для указанного поставщика или сокета (см. SO_GROUP_PRIORITY ограничения). | |
Подключение сбрасывается при установке SO_KEEPALIVE . | |
Дескриптор не является сокетом. |
Замечания
Функция setsockopt задает текущее значение параметра сокета, связанного с сокетом любого типа в любом состоянии. Хотя параметры могут существовать на нескольких уровнях протокола, они всегда присутствуют на самом верхнем уровне сокета. Параметры влияют на операции сокета, такие как получение быстрых данных (например, данных OOB) в обычном потоке данных, а также возможность отправки широковещательных сообщений на сокет.
sizeof(int)
логическим параметрам. Для других параметров optval указывает на целое число или структуру, содержащую требуемое значение параметра, и optlen — длина целого или структуры.
В следующих таблицах перечислены некоторые распространенные параметры, поддерживаемые функцией setsockopt . Столбец Type определяет тип данных, адресуемых параметром optval . Столбец Description содержит некоторые основные сведения о параметре сокета. Более полные списки параметров сокета и более подробные сведения (например, значения по умолчанию) см. в подробных разделах в разделе "Параметры сокета".
уровень = SOL_SOCKET
Ценность | Тип | Description |
---|---|---|
SO_BROADCAST | BOOL | Настраивает сокет для отправки широковещательных данных. |
SO_CONDITIONAL_ACCEPT | BOOL | Позволяет принимать или отклонять входящие подключения приложением, а не стеком протоколов. |
SO_DEBUG | BOOL | Включает выходные данные отладки. В настоящее время поставщики Майкрософт не выводит никаких сведений об отладке. |
SO_DONTLINGER | BOOL | Не блокирует закрытие ожидания отправки неотступных данных. Установка этого параметра эквивалентна настройке SO_LINGER с l_onoff равным нулю. |
SO_DONTROUTE | BOOL | Задает, следует ли отправлять исходящие данные в интерфейсе, к сокету привязан и не перенаправлен на другой интерфейс. Этот параметр не поддерживается в сокетах ATM (приводит к ошибке). |
SO_GROUP_PRIORITY | инт | Скрытный. |
SO_KEEPALIVE | BOOL | Включает отправку пакетов для подключения сокета. Не поддерживается в сокетах ATM (приводит к ошибке). |
SO_LINGER | МЕДЛИТЬ | Задерживается при закрытии, если неотступные данные присутствуют. |
SO_OOBINLINE | BOOL | Указывает, что не привязанные данные должны быть возвращены в строке с обычными данными. Этот параметр действителен только для протоколов, ориентированных на подключение, которые поддерживают внеполосные данные. Обсуждение этой статьи см. в разделе " Независимые от протокола" данные вне диапазона. |
SO_RCVBUF | инт | Указывает общее пространство буфера для каждого сокета, зарезервированное для получения. |
SO_REUSEADDR | BOOL | Позволяет связать сокет с адресом, который уже используется. Дополнительные сведения см. в разделе bind. Неприменимо к сокетам ATM. |
SO_EXCLUSIVEADDRUSE | BOOL | Позволяет привязать сокет к эксклюзивному доступу. Не требуется права администратора. |
SO_RCVTIMEO | DWORD (32-битное целое число) | Задает время ожидания (в миллисекундах) для блокировки вызовов приема. |
SO_SNDBUF | инт | Указывает общее пространство буфера для каждого сокета, зарезервированное для отправки. |
SO_SNDTIMEO | DWORD (32-битное целое число) | Время ожидания (в миллисекундах) для блокировки вызовов отправки. |
SO_UPDATE_ACCEPT_CONTEXT | UINT_PTR | Обновляет принимающие сокеты с контекстом прослушивающего сокета. |
PVD_CONFIG | Зависимый поставщик услуг | Этот объект хранит сведения о конфигурации поставщика услуг, связанного с сокетами. Точный формат этой структуры данных — это конкретный поставщик услуг. |
уровень = IPPROTO_TCP
См. TCP_NODELAY в параметрахсокета IPPROTO_TCP. Дополнительные сведения о параметрах сокета для IPPROTO_TCP уровня = см. в этом разделе.
уровень = NSPROTO_IPX
Ценность | Тип | Description |
---|---|---|
IPX_PTYPE | инт | Задает тип пакета IPX. |
IPX_FILTERPTYPE | инт | Задает тип пакета фильтра получения |
IPX_STOPFILTERPTYPE | инт | Останавливает фильтрацию набора типов фильтра с помощью IPX_FILTERTYPE |
IPX_DSTYPE | инт | Задает значение поля потока данных в заголовке 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 , отображаются в следующей таблице.
Ценность | Тип | Description |
---|---|---|
SO_ACCEPTCONN | BOOL | Возвращает, находится ли сокет в режиме прослушивания. Этот параметр действителен только для протоколов, ориентированных на подключение. Этот параметр сокета не поддерживается для параметра. |
SO_RCVLOWAT | инт | Параметр сокета из BSD UNIX, включенный для обратной совместимости. Этот параметр задает минимальное количество байтов для обработки операций ввода сокета. |
SO_SNDLOWAT | инт | Параметр сокета из BSD UNIX, включенный для обратной совместимости. Этот параметр задает минимальное количество байтов для обработки операций вывода сокета. |
SO_TYPE | инт | Возвращает тип сокета для заданного сокета (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 предоставляет следующий параметр сокета:
Ценность Тип Meaning IRLMP_IAS_SET *IAS_SET Задает атрибуты IAS
Параметр сокета IRLMP_IAS_SET позволяет приложению задать один атрибут одного класса в локальном IAS. Приложение задает класс для задания, атрибута и типа атрибута. Ожидается, что приложение выделяет буфер необходимого размера для переданных параметров.
IrDA предоставляет базу данных IAS, в которой хранятся сведения на основе IrDA. Ограниченный доступ к базе данных IAS доступен через интерфейс Windows Sockets 2, но такой доступ обычно не используется приложениями и существует в основном для поддержки подключений к устройствам, не соответствующих соглашениям 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] |
целевая платформа | Виндоус |
Header | winsock.h (include Winsock2.h) |
Library | Ws2_32.lib |
DLL | Ws2_32.dll |