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


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

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

Замечания

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

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

уровень = 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, например этот параметр сокета не поддерживается для параметра типа сокета.
 
Заметка При выдаче блокирующего вызова 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 предоставляет следующий параметр сокета:
    Ценность Тип 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

См. также

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

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

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

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

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

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

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

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

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

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

WSASyncSelect

WSAEventSelect

WSAIoctl

Функции Winsock

связывать

getsockopt

ioctlsocket

розетка