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 는 0을 반환합니다. 그렇지 않으면 SOCKET_ERROR 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다.

오류 코드 의미
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEFAULT
optval 매개 변수가 가리키는 버퍼가 프로세스 주소 공간의 유효한 부분에 있지 않거나 optlen 매개 변수가 너무 작습니다.
WSAEINPROGRESS
차단 Windows 소켓 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEINVAL
level 매개 변수가 유효하지 않거나 optval 매개 변수가 가리키는 버퍼의 정보가 잘못되었습니다.
WSAENETRESET
SO_KEEPALIVE 설정되면 연결 시간이 초과되었습니다.
WSAENOPROTOOPT
옵션은 지정된 공급자 또는 소켓에 대해 알 수 없거나 지원되지 않습니다(SO_GROUP_PRIORITY 제한 사항 참조).
WSAENOTCONN
SO_KEEPALIVE 설정되면 연결이 다시 설정되었습니다.
WSAENOTSOCK
설명자가 소켓이 아닙니다.

설명

setsockopt 함수는 모든 상태의 모든 형식의 소켓과 연결된 소켓 옵션의 현재 값을 설정합니다. 옵션은 여러 프로토콜 수준에서 존재할 수 있지만 항상 가장 높은 소켓 수준에 있습니다. 옵션은 긴급 데이터(예: OOB 데이터)가 일반 데이터 스트림에서 수신되는지 여부 및 브로드캐스트 메시지를 소켓에서 보낼 수 있는지 여부와 같은 소켓 작업에 영향을 줍니다.

참고bind 함수 전에 setsockopt 함수가 호출되면 바인딩이 발생할 때까지 TCP/IP를 사용하여 TCP/IP 옵션을 검사하지 않습니다. 이 경우 setsockopt 함수 호출은 항상 성공하지만 초기 setsockopt 호출 실패로 인해 바인딩 함수 호출이 실패할 수 있습니다.
 
참고 소켓이 열리면 setsockopt 호출이 수행되고 sendto 호출이 수행되면 Windows Sockets는 암시적 바인딩 함수 호출을 수행합니다.
 
소켓 옵션에는 기능 또는 동작을 사용하거나 사용하지 않도록 설정하는 부울 옵션과 정수 값 또는 구조가 필요한 옵션의 두 가지 유형이 있습니다. 부울 옵션을 사용하도록 설정하려면 optval 매개 변수가 0이 아닌 정수를 가리킵니다. 옵션을 사용하지 않도록 설정하려면 optval 이 0과 같은 정수 를 가리킵니다. optlen 매개 변수는 부울 옵션의 sizeof(int) 경우 와 같아야 합니다. 다른 옵션의 경우 optval 은 옵션에 대해 원하는 값을 포함하는 정수 또는 구조를 가리키고 optlen 은 정수 또는 구조체의 길이입니다.

다음 표에는 setsockopt 함수에서 지원하는 몇 가지 일반적인 옵션이 나열되어 있습니다. Type 열은 optval 매개 변수로 주소가 지정된 데이터 형식을 식별합니다. 설명 열은 소켓 옵션에 대한 몇 가지 기본 정보를 제공합니다. 소켓 옵션의 전체 목록과 자세한 정보(예: 기본값)는 소켓 옵션 아래의 자세한 topics 참조하세요.

수준 = SOL_SOCKET

형식 설명
SO_BROADCAST BOOL 브로드캐스트 데이터를 보내기 위한 소켓을 구성합니다.
SO_CONDITIONAL_ACCEPT BOOL 들어오는 연결은 프로토콜 스택이 아닌 애플리케이션에서 수락하거나 거부할 수 있습니다.
SO_DEBUG BOOL 디버그 출력을 사용하도록 설정합니다. Microsoft 공급자는 현재 디버그 정보를 출력하지 않습니다.
SO_DONTLINGER BOOL 보내지 않은 데이터가 전송될 때까지 대기하는 닫기를 차단하지 않습니다. 이 옵션을 설정하는 것은 l_onoff 0으로 설정된 SO_LINGER 설정하는 것과 같습니다.
SO_DONTROUTE BOOL 다른 인터페이스에서 라우팅되지 않고 소켓이 바인딩된 인터페이스에서 보내는 데이터를 보낼지 여부를 설정합니다. 이 옵션은 ATM 소켓에서 지원되지 않습니다(오류 발생).
SO_GROUP_PRIORITY int 예약되어 있습니다.
SO_KEEPALIVE BOOL 소켓 연결에 대해 연결 유지 패킷을 보낼 수 있습니다. ATM 소켓에서 지원되지 않습니다(오류가 발생).
SO_LINGER 머무르게 들여쓰지 않은 데이터가 있는 경우 닫기 상태로 남아 있습니다.
SO_OOBINLINE BOOL 바인딩되지 않은 데이터가 일반 데이터와 함께 인라인으로 반환되어야 했음을 나타냅니다. 이 옵션은 대역 외 데이터를 지원하는 연결 지향 프로토콜에만 유효합니다. 이 항목에 대한 자세한 내용은 프로토콜 독립 대역 외 데이터를 참조하세요.
SO_RCVBUF int 받기용으로 예약된 소켓당 버퍼 공간 전체를 지정합니다.
SO_REUSEADDR BOOL 소켓이 이미 사용 중인 주소에 바인딩될 수 있습니다. 자세한 내용은 바인딩을 참조 하세요. ATM 소켓에는 적용되지 않습니다.
SO_EXCLUSIVEADDRUSE BOOL 단독 액세스를 위해 소켓에 바인딩할 수 있습니다. 관리 권한이 필요하지 않습니다.
SO_RCVTIMEO DWORD 수신 호출을 차단하기 위한 시간 제한(밀리초)을 설정합니다.
SO_SNDBUF int 보내기용으로 예약된 소켓당 버퍼 공간 전체를 지정합니다.
SO_SNDTIMEO DWORD 송신 호출을 차단하는 시간 제한(밀리초)입니다.
SO_UPDATE_ACCEPT_CONTEXT int 수신 소켓의 컨텍스트를 사용하여 수락 소켓을 업데이트.
PVD_CONFIG 서비스 공급자 종속 이 개체는 소켓 s와 연결된 서비스 공급자에 대한 구성 정보를 저장 합니다. 이 데이터 구조의 정확한 형식은 서비스 공급자별로 다릅니다.
  수준 = SOL_SOCKET 대한 소켓 옵션에 대한 자세한 내용은 SOL_SOCKET 소켓 옵션을 참조하세요.

수준 = IPPROTO_TCP

IPPROTO_TCP 소켓 옵션의 TCP_NODELAY 참조하세요. 수준 = 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 ACK를 보내기 전에 SPX 연결이 지연되지 않도록 지시합니다. 앞뒤로 트래픽이 없는 애플리케이션은 성능을 향상시키려면 이를 TRUE 로 설정해야 합니다.
 

수준 = NSPROTO_IPX 소켓 옵션에 대한 자세한 내용은 NSPROTO_IPX 소켓 옵션을 참조하세요.

setsockopt에 대해 지원되지 않는 BSD 옵션은 다음 표에 나와 있습니다.

형식 설명
SO_ACCEPTCONN BOOL 소켓이 수신 모드에 있는지 여부를 반환합니다. 이 옵션은 연결 지향 프로토콜에 대해서만 유효합니다. 이 소켓 옵션은 설정에 대해 지원되지 않습니다.
SO_RCVLOWAT int 이전 버전과의 호환성을 위해 포함된 BSD UNIX의 소켓 옵션입니다. 이 옵션은 소켓 입력 작업에 대해 처리할 최소 바이트 수를 설정합니다.
SO_SNDLOWAT int 이전 버전과의 호환성을 위해 포함된 BSD UNIX의 소켓 옵션입니다. 이 옵션은 소켓 출력 작업에 대해 처리할 최소 바이트 수를 설정합니다.
SO_TYPE int 지정된 소켓(SOCK_STREAM 또는 SOCK_DGRAM 대한 소켓 유형을 반환합니다. 예를 들어 이 소켓 옵션은 소켓 유형 설정에 지원되지 않습니다.
 
참고setsockopt와 같은 차단 Winsock 호출을 실행할 때 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 소켓에 대한 참고 사항

IrDA용 Windows 소켓을 사용하여 애플리케이션을 개발할 때 다음 사항에 유의하세요.

  • Af_irda.h 헤더 파일을 명시적으로 포함해야 합니다.
  • IrDA는 다음 소켓 옵션을 제공합니다.
    Type 의미
    IRLMP_IAS_SET *IAS_SET IAS 특성 설정
     

IRLMP_IAS_SET 소켓 옵션을 사용하면 애플리케이션이 로컬 IAS에서 단일 클래스의 단일 특성을 설정할 수 있습니다. 애플리케이션은 설정할 클래스, 특성 및 특성 형식을 지정합니다. 애플리케이션은 전달된 매개 변수에 필요한 크기의 버퍼를 할당해야 합니다.

IrDA는 IrDA 기반 정보를 저장하는 IAS 데이터베이스를 제공합니다. IAS 데이터베이스에 대한 제한된 액세스는 Windows 소켓 2 인터페이스를 통해 사용할 수 있지만 이러한 액세스는 일반적으로 애플리케이션에서 사용되지 않으며 주로 Windows Sockets 2 IrDA 규칙을 준수하지 않는 비 Windows 디바이스에 대한 연결을 지원하기 위해 존재합니다.

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 8 이상에서 Windows Phone 스토어 앱에서 지원됩니다.

Windows 8.1Windows Server 2012 R2: 이 함수는 Windows 8.1, Windows Server 2012 R2 이상의 Windows 스토어 앱에서 지원됩니다.

요구 사항

   
지원되는 최소 클라이언트 Windows 8.1, Windows Vista [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 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 소켓 옵션

소켓 옵션

WSAAsyncSelect

WSAEventSelect

WSAIoctl

Winsock 함수

bind

getsockopt

ioctlsocket

socket