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


Функция 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.

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

Комментарии

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

Примечание Если функция setsockopt вызывается перед функцией bind , параметры TCP/IP не будут проверяться с помощью TCP/IP, пока привязка не произойдет. В этом случае вызов функции setsockopt всегда будет выполнен успешно, но вызов функции привязки может завершиться ошибкой из-за сбоя раннего вызова setsockopt .
 
Примечание Если открывается сокет, выполняется вызов setockopt , а затем выполняется вызов sendto , Windows Sockets выполняет неявный вызов функции привязки .
 
Существует два типа параметров сокета: логические параметры, которые позволяют включать или отключать функцию или поведение, и параметры, требующие целочисленного значения или структуры. Чтобы включить логический параметр, параметр optval указывает на ненулевое целое число. Отключение параметра optval указывает на целое число, равное нулю. Параметр optlen должен быть равен 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 Зависимость от поставщика услуг Этот объект хранит сведения о конфигурации для поставщика служб, связанного с сокетами. Точный формат этой структуры данных зависит от поставщика услуг.
  Более полные и подробные сведения о параметрах сокетов дляSOL_SOCKETуровня = см. в разделе SOL_SOCKET параметры сокета.

Уровень = 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, например этот параметр не поддерживается для параметра типа сокета.
 
Примечание При выполнении блокирующего вызова Winsock, например setsockopt, Winsock может потребоваться дождаться сетевого события, прежде чем вызов сможет завершиться. В этой ситуации Winsock выполняет оповещенное ожидание, которое может быть прервано асинхронным вызовом процедуры (APC), запланированным в том же потоке. Выполнение другого блокирующего вызова Winsock внутри APC, который прервал текущий блокирующий вызов Winsock в том же потоке, приведет к неопределенному поведению и никогда не должен выполняться клиентами Winsock.
 

Пример кода

В следующем примере показана функция 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

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

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

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

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

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

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

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

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

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

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

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

WSAsyncSelect

WSAEventSelect

WSAIoctl

Функции Winsock

bind

getsockopt

ioctlsocket

Сокета