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를 호출하여 특정 오류 코드를 검색할 수 있습니다.
오류 코드 | 의미 |
---|---|
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다. | |
네트워크 하위 시스템이 실패했습니다. | |
optval 매개 변수가 가리키는 버퍼가 프로세스 주소 공간의 유효한 부분에 있지 않거나 optlen 매개 변수가 너무 작습니다. | |
차단 Windows 소켓 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다. | |
level 매개 변수가 유효하지 않거나 optval 매개 변수가 가리키는 버퍼의 정보가 잘못되었습니다. | |
SO_KEEPALIVE 설정되면 연결 시간이 초과되었습니다. | |
옵션은 지정된 공급자 또는 소켓에 대해 알 수 없거나 지원되지 않습니다(SO_GROUP_PRIORITY 제한 사항 참조). | |
SO_KEEPALIVE 설정되면 연결이 다시 설정되었습니다. | |
설명자가 소켓이 아닙니다. |
설명
setsockopt 함수는 모든 상태의 모든 형식의 소켓과 연결된 소켓 옵션의 현재 값을 설정합니다. 옵션은 여러 프로토콜 수준에서 존재할 수 있지만 항상 가장 높은 소켓 수준에 있습니다. 옵션은 긴급 데이터(예: OOB 데이터)가 일반 데이터 스트림에서 수신되는지 여부 및 브로드캐스트 메시지를 소켓에서 보낼 수 있는지 여부와 같은 소켓 작업에 영향을 줍니다.
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와 연결된 서비스 공급자에 대한 구성 정보를 저장 합니다. 이 데이터 구조의 정확한 형식은 서비스 공급자별로 다릅니다. |
수준 = 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 함수를 보여 줍니다.#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.1 및 Windows 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 |