getsockopt 함수(winsock.h)

getsockopt 함수는 소켓 옵션을 검색합니다.

구문

int getsockopt(
  [in]      SOCKET s,
  [in]      int    level,
  [in]      int    optname,
  [out]     char   *optval,
  [in, out] int    *optlen
);

매개 변수

[in] s

소켓을 식별하는 설명자입니다.

[in] level

옵션이 정의된 수준입니다. 예: SOL_SOCKET.

[in] optname

값을 검색할 소켓 옵션입니다. 예: SO_ACCEPTCONN. optname 값은 지정된 수준 내에 정의된 소켓 옵션이어야 합니다. 그렇지 않으면 동작이 정의되지 않았습니다.

[out] optval

요청된 옵션의 값을 반환할 버퍼에 대한 포인터입니다.

[in, out] optlen

옵트발 버퍼의 크기(바이트)에 대한 포인터입니다.

반환 값

오류가 발생하지 않으면 getsockopt 는 0을 반환합니다. 그렇지 않으면 SOCKET_ERROR 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다.

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

설명

getsockopt 함수는 모든 형식의 소켓과 연결된 소켓 옵션의 현재 값을 모든 상태에서 검색하고 결과를 optval에 저장합니다. 옵션은 여러 프로토콜 수준에서 존재할 수 있지만 항상 가장 높은 소켓 수준에 있습니다. 옵션은 패킷 라우팅 및 OOB 데이터 전송과 같은 소켓 작업에 영향을 줍니다.

선택한 옵션과 연결된 값이 버퍼 옵트발에 반환됩니다. optlen이 가리키는 정수는 원래 이 버퍼의 크기를 포함해야 합니다. 반환 시 반환되는 값의 크기로 설정됩니다. SO_LINGER 경우 이는 LINGER 구조체의 크기입니다. 대부분의 다른 옵션의 경우 정수의 크기가 됩니다.

애플리케이션은 지정된 매개 변수에 의해 직접 또는 간접적으로 가리키는 메모리 공간을 할당해야 합니다.

setsockopt를 사용하여 옵션을 설정하지 않은 경우 getsockopt는 옵션의 기본값을 반환합니다.

다음 옵션은 getsockopt에 대해 지원됩니다. Type 열은 optval로 주소가 지정된 데이터 형식을 식별합니다.

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

optname 매개 변수에 대한 다음 값 표는 level 매개 변수가 SOL_SOCKET 설정되면 유효합니다.

Type 의미
SO_ACCEPTCONN BOOL 소켓이 수신 중입니다.
SO_BROADCAST BOOL 소켓은 브로드캐스트 메시지의 전송 및 수신을 위해 구성됩니다.
SO_BSP_STATE CSADDR_INFO 소켓에서 사용하는 로컬 주소, 로컬 포트, 원격 주소, 원격 포트, 소켓 유형 및 프로토콜을 반환합니다.
SO_CONDITIONAL_ACCEPT BOOL setsockopt 또는 시스템 기본값에 대한 이전 호출에서 현재 소켓 상태를 반환합니다.
SO_CONNECT_TIME DWORD 소켓이 연결된 시간(초)을 반환합니다. 이 소켓 옵션은 연결 지향 프로토콜에만 유효합니다.
SO_DEBUG BOOL 디버깅을 사용할 수 있습니다.
SO_DONTLINGER BOOL TRUE이면 SO_LINGER 옵션을 사용할 수 없습니다.
SO_DONTROUTE BOOL 라우팅을 사용할 수 없습니다. 이 설정은 성공하지만 AF_INET 소켓에서는 무시됩니다. 는 WSAENOPROTOOPT를 사용하는 AF_INET6 소켓에서 실패합니다. 이 옵션은 ATM 소켓에서 지원되지 않습니다.
SO_ERROR int 오류 상태 검색하고 지웁니다.
SO_EXCLUSIVEADDRUSE BOOL 다른 소켓이 동일한 주소 및 포트에 바인딩되지 않도록 합니다. 바인딩 함수를 호출하기 전에 이 옵션을 설정해야 합니다.
SO_GROUP_ID GROUP 예약되어 있습니다.
SO_GROUP_PRIORITY int 예약되어 있습니다.
SO_KEEPALIVE BOOL 연결 유지가 전송되고 있습니다. ATM 소켓에서는 지원되지 않습니다.
SO_LINGER LINGER 구조체 현재 느린 옵션을 반환합니다.
SO_MAX_MSG_SIZE 부호 없는 정수 메시지 지향 소켓 유형에 대한 메시지의 최대 크기입니다(예: SOCK_DGRAM). 스트림 지향 소켓에는 의미가 없습니다.
SO_OOBINLINE BOOL OOB 데이터는 일반 데이터 스트림에서 수신됩니다. 이 항목 에 대한 설명은 Windows 소켓 1.1 차단 루틴 및 EINPROGRESS 섹션을 참조하세요.
SO_PORT_SCALABILITY BOOL 로컬 컴퓨터에서 다른 로컬 주소 포트 쌍에 대해 와일드카드 포트를 여러 번 할당하여 포트 할당을 최대화하여 소켓에 대한 로컬 포트 확장성을 사용하도록 설정합니다.
SO_PROTOCOL_INFO WSAPROTOCOL_INFO 이 소켓에 바인딩된 프로토콜에 대한 프로토콜 정보에 대한 설명입니다.
SO_RCVBUF int 수신을 위해 예약된 총 소켓당 버퍼 공간입니다. 이는 SO_MAX_MSG_SIZE 관련이 없으며 반드시 TCP 수신 창의 크기에 해당하지는 않습니다.
SO_REUSEADDR BOOL 소켓은 이미 사용 중인 주소에 바인딩할 수 있습니다. ATM 소켓에는 적용되지 않습니다.
SO_SNDBUF int 송신을 위해 예약된 총 소켓당 버퍼 공간입니다. 이는 SO_MAX_MSG_SIZE 관련이 없으며 반드시 TCP 송신 창의 크기에 해당하지는 않습니다.
SO_TYPE int 소켓의 형식입니다(예: SOCK_STREAM).
PVD_CONFIG 서비스 공급자 종속 소켓 s와 연결된 서비스 공급자의 불투명 데이터 구조 개체 입니다. 이 개체는 서비스 공급자의 현재 구성 정보를 저장합니다. 이 데이터 구조의 정확한 형식은 서비스 공급자별로 다릅니다.
 

수준 = IPPROTO_TCP

IPPROTO_TCP 소켓 옵션의 TCP_NODELAY 참조하세요. 수준 = IPPROTO_TCP 소켓 옵션에 대한 자세한 내용은 해당 항목을 참조하세요.  

optname 매개 변수에 대한 다음 값 표는 수준 매개 변수가 NSPROTO_IPX 설정되면 유효합니다.

참고 Windows NT 모든 IPX 옵션을 지원합니다. Windows Me, Windows 98 및 Windows 95는 다음 옵션만 지원합니다.
IPX_PTYPE
IPX_FILTERPTYPE
IPX_DSTYPE
IPX_RECVHDR
IPX_MAXSIZE
IPX_ADDRESS
 
Type 의미
IPX_PTYPE int IPX 패킷 유형을 검색합니다.
IPX_FILTERPTYPE int 수신 필터 패킷 유형을 검색합니다.
IPX_DSTYPE int 전송된 모든 패킷의 SPX 헤더에 있는 데이터 스트림 필드의 값을 가져옵니다.
IPX_EXTENDED_ADDRESS BOOL 확장 주소 지정을 사용할 수 있는지 여부를 확인합니다.
IPX_RECVHDR BOOL 프로토콜 헤더가 모든 수신 헤더에 전송되는지 여부를 확인합니다.
IPX_MAXSIZE int 보낼 수 있는 최대 데이터 크기를 가져옵니다.
IPX_ADDRESS IPX_ADDRESS_DATA 구조체 IPX가 바인딩된 특정 어댑터에 대한 정보를 가져옵니다. 어댑터 번호 매기기는 기본 0입니다. 어댑터넘 멤버는 반환 시 채워집니다.
IPX_GETNETINFO IPX_NETNUM_DATA 구조체 특정 IPX 네트워크 번호에 대한 정보를 가져옵니다. 캐시에서 사용할 수 없는 경우 는 RIP를 사용하여 정보를 가져옵니다.
IPX_GETNETINFO_NORIP IPX_NETNUM_DATA 구조체 특정 IPX 네트워크 번호에 대한 정보를 가져옵니다. 캐시에서 사용할 수 없는 경우 는 RIP를 사용하여 정보를 가져오지 않고 오류를 반환합니다.
IPX_SPXGETCONNECTIONSTATUS IPX_SPXCONNSTATUS_DATA 구조체 연결된 SPX 소켓에 대한 정보를 검색합니다.
IPX_ADDRESS_NOTIFY IPX_ADDRESS_DATA 구조체 IPX가 바인딩된 어댑터에서 변경이 발생할 때 상태 알림을 검색합니다.
IPX_MAX_ADAPTER_NUM int 기본 0으로 번호가 매겨진 최대 어댑터 수를 검색합니다.
IPX_RERIPNETNUMBER IPX_NETNUM_DATA 구조체 IPX_GETNETINFO 비슷하지만 네트워크 정보가 로컬 캐시에 있더라도 IPX가 확인을 위해 RIP를 사용하도록 강제합니다.
IPX_IMMEDIATESPXACK BOOL ACK를 보내기 전에 SPX 연결이 지연되지 않도록 지시합니다. 앞뒤로 트래픽이 없는 애플리케이션은 성능을 향상시키려면 이를 TRUE 로 설정해야 합니다.
TCP_MAXSEG int TCP 최대 세그먼트 크기를 받습니다. Windows 10 이상 버전에서 지원합니다.
 

다음 표에서는 getsockopt 함수에서 지원되지 않는 BSD 소켓 옵션을 나타내는 optname에 대한 값을 나열합니다.

Type 의미
SO_RCVLOWAT int 낮은 워터마크를 받습니다.
SO_RCVTIMEO int 시간 초과를 받습니다.
SO_SNDLOWAT int 낮은 워터마크를 보냅니다.
SO_SNDTIMEO int 시간 초과를 보냅니다.
TCP_MAXSEG int TCP 최대 세그먼트 크기를 받습니다. Windows 10 이전 버전에서는 지원되지 않습니다.
 
참고recv 함수를 사용하는 경우 SO_RCVTIMEO 지정된 기간 동안 데이터가 도착하지 않으면 recv 함수가 완료됩니다. Windows 2000 이전의 Windows 버전에서는 이후에 수신된 모든 데이터가 WSAETIMEDOUT으로 실패합니다. Windows 2000 이상에서는 SO_RCVTIMEO 지정된 기간 내에 데이터가 도착하지 않으면 recv 함수는 WSAETIMEDOUT을 반환하고 데이터가 수신되면 recv 는 SUCCESS를 반환합니다.
 

지원되지 않는 옵션을 사용하여 getsockopt를 호출하면 WSAGetLastError에서 WSAENOPROTOOPT의 오류 코드가 반환됩니다.

getsockopt 함수에서 지원하는 optname 매개 변수에 대한 일부 소켓 옵션에 대한 자세한 내용은 다음과 같습니다.

SO_CONNECT_TIME
이 옵션은 소켓이 연결된 시간(초)을 반환합니다. 이 옵션은 연결 지향 프로토콜에만 유효합니다.

SO_CONNECT_TIME 옵션을 getsockopt 함수와 함께 사용하여 연결이 설정되었는지 여부를 검사 수 있습니다. ConnectEx 함수 호출이 진행 중인 동안에도 이 옵션을 사용할 수 있습니다. 연결이 설정된 경우 SO_CONNECT_TIME 옵션은 연결이 설정된 기간을 결정할 수 있습니다. 소켓이 연결되어 있지 않으면 getsockopt 는 SOCKET_ERROR 반환합니다. 이와 같은 연결을 확인하려면 데이터를 보내지 않고 잠시 동안 설정된 연결을 확인해야 합니다. 애플리케이션에서 이러한 연결을 종료하는 것이 좋습니다.

SO_DEBUG
참고 Windows Sockets 서비스 공급자는 애플리케이션에서 SO_DEBUG 옵션을 설정한 경우 출력 디버그 정보를 제공하는 것이 좋습니다(필수는 아님). 디버그 정보를 생성하는 메커니즘과 디버그 정보를 사용하는 양식은 이 문서의 scope 넘어갑니다.
 
SO_ERROR
SO_ERROR 옵션은 WSAGetLastError 및 WSASetLastError 함수 호출을 사용하여 처리되는 스레드 기반 오류 코드와 다른 소켓 기반 오류 코드를 반환하고 다시 설정합니다. 소켓을 사용한 성공적인 호출은 SO_ERROR 옵션에서 반환된 소켓 기반 오류 코드를 다시 설정하지 않습니다.
SO_EXCLUSIVEADDRUSE
다른 소켓이 동일한 주소 및 포트에 바인딩되지 않도록 합니다. 바인딩 함수를 호출하기 전에 이 옵션을 설정해야 합니다. 자세한 내용은 SO_EXCLUSIVEADDRUSE 참조를 참조하세요.
SO_GROUP_ID
참고 이 옵션은 예약되어 있습니다. 이 옵션은 getsockopt에만 적용됩니다. 값은 NULL이어야 합니다.
 
SO_GROUP_PRIORITY
이 옵션은 예약되어 있습니다. 그룹 우선 순위는 소켓 그룹 내의 다른 소켓을 기준으로 지정된 소켓의 우선 순위를 나타냅니다. 값은 가장 높은 우선 순위에 해당하는 0이 있는 무수한 정수입니다. 우선 순위 값은 잠재적으로 부족한 리소스를 할당해야 하는 방법에 대한 기본 서비스 공급자에 대한 힌트를 나타냅니다. 예를 들어 둘 이상의 소켓이 둘 다 데이터를 전송할 준비가 될 때마다 우선 순위가 가장 높은 소켓(SO_GROUP_PRIORITY 가장 낮은 값)을 먼저 서비스해야 하며 나머지는 상대 우선 순위에 따라 차례로 처리됩니다.

WSAENOPROTOOPT 오류 코드는 그룹 소켓이 아닌 소켓 또는 그룹 소켓을 지원하지 않는 서비스 공급자에 대해 표시됩니다.

SO_KEEPALIVE
애플리케이션은 SO_KEEPALIVE 소켓 옵션을 설정하여 TCP/IP 서비스 공급자가 TCP 연결에서 유지 패킷을 사용하도록 요청할 수 있습니다. 이 옵션은 소켓에서 keep-alive 옵션의 현재 값을 쿼리합니다. Windows 소켓 공급자는 연결 유지 사용을 지원할 필요가 없습니다. 이 경우 정확한 의미 체계는 구현에 따라야 하지만 인터넷 호스트 요구 사항-IETF 웹 사이트에서 사용할 수 있는 RFC 1122에 지정된 통신 계층의 섹션 4.2.3.6을 준수해야 합니다. 연결 유지의 결과로 연결이 끊어지면 오류 코드 WSAENETRESET 이 소켓에서 진행 중인 모든 호출에 반환되고 후속 호출은 WSAENOTCONN으로 실패합니다. SO_KEEPALIVE ATM 소켓에서 지원되지 않으며 ATM 소켓에서 유지 패킷을 사용하도록 요청하면 소켓에서 오류가 반환됩니다.
SO_LINGER
SO_LINGER 소켓에서 데이터가 큐에 대기되고 closesocket 이 수행될 때 수행되는 작업을 제어합니다. SO_LINGER 설정 이 closesocket 의 의미 체계에 미치는 영향에 대한 설명은 closesocket을 참조하세요. 애플리케이션은 옵트발 매개 변수로 가리키는 LINGER 구조를 검색하여 현재 동작을 가져옵니다.
SO_MAX_MSG_SIZE
특정 서비스 공급자가 구현한 메시지 지향 소켓 유형(예: SOCK_DGRAM)에 대한 메시지의 최대 아웃바운드(송신) 크기를 나타내는 get-only 소켓 옵션입니다. 바이트 스트림 지향 소켓에는 의미가 없습니다. 최대 인바운드-메시지 크기를 확인할 수 있는 프로비저닝이 없습니다.
SO_PROTOCOL_INFO
이 옵션은 이 소켓과 연결된 WSAPROTOCOL_INFO 구조를 제공하는 get-only 옵션입니다. 이 구조체에 대한 자세한 내용은 WSAEnumProtocols 를 참조하세요.
SO_SNDBUF
Windows 소켓 구현이 SO_RCVBUF 및 SO_SNDBUF 옵션을 지원하는 경우 애플리케이션은 다른 버퍼 크기(더 크거나 작음)를 요청할 수 있습니다. 구현이 요청된 전체 금액을 제공하지 않은 경우에도 setsockopt에 대한 호출이 성공할 수 있습니다. 애플리케이션은 실제로 제공된 버퍼 크기를 검사 동일한 옵션으로 이 함수를 호출해야 합니다.
SO_REUSEADDR
기본적으로 소켓은 이미 사용 중인 로컬 주소에 바인딩( 바인딩 참조)할 수 없습니다. 그러나 경우에 따라 이러한 방식으로 주소를 다시 사용해야 할 수 있습니다. 모든 연결은 로컬 주소와 원격 주소의 조합으로 고유하게 식별되므로 원격 주소가 다르면 동일한 로컬 주소에 두 개의 소켓이 바인딩되는 데 문제가 없습니다. 원하는 주소가 이미 다른 소켓에서 사용 중이므로 소켓의 바인딩 을 허용해서는 안 됨을 Windows 소켓 공급자에게 알리려면 애플리케이션이 바인딩을 실행하기 전에 소켓에 대한 SO_REUSEADDR 소켓 옵션을 설정해야 합니다. 옵션은 바인딩 시에만 해석됩니다. 따라서 기존 주소에 바인딩되지 않는 소켓에서 옵션을 설정하는 것은 불필요하지만 무해하며, 바인딩 이 이 소켓 또는 다른 소켓에 영향을 주지 않으면 옵션을 설정하거나 다시 설정합니다. SO_REUSEADDR ATM 소켓에 적용할 수 없으며 재사용 및 주소 요청으로 인해 오류가 발생하지는 않지만 ATM 소켓이 사용 중일 때에는 영향을 주지 않습니다.
PVD_CONFIG
이 옵션은 소켓과 연결된 서비스 공급자에서 불투명 데이터 구조 개체를 검색 합니다. 이 개체는 서비스 공급자의 현재 구성 정보를 저장합니다. 이 데이터 구조의 정확한 형식은 서비스 공급자에 따라 다릅니다.
Tcp_nodelay
TCP_NODELAY 옵션은 TCP/IP 서비스 공급자와 관련이 있습니다. TCP_NODELAY 옵션을 사용하도록 설정하면 Nagle 알고리즘이 비활성화되고 그 반대의 경우도 마찬가지입니다. Nagle 알고리즘(RFC 896에 설명됨)은 호스트에서 보내는 작은 패킷 수를 줄이는 데 매우 효과적입니다. 이 프로세스에는 이미 승인되지 않은 데이터가 있을 때 전송 데이터를 버퍼링하거나 전체 크기 패킷을 보낼 수 있을 때까지 전송 데이터를 버퍼링하는 작업이 포함됩니다. 대부분의 애플리케이션 프로토콜에서 Nagle 알고리즘이 상당한 성능 향상을 제공할 수 있으므로 Windows 소켓 구현에서 기본적으로 Nagle 알고리즘을 사용하도록 설정하는 것이 좋습니다. 그러나 일부 애플리케이션의 경우 이 알고리즘이 성능을 저해할 수 있으며 동일한 옵션을 사용하는 setsockopt 를 사용하여 해제할 수 있습니다. 이러한 애플리케이션은 많은 작은 메시지가 전송되고 메시지 간의 시간 지연이 유지되는 애플리케이션입니다.
참고getsockopt와 같은 차단 Winsock 호출을 실행할 때 Winsock은 호출이 완료되기 전에 네트워크 이벤트를 기다려야 할 수 있습니다. Winsock은 이 상황에서 경고 가능한 대기를 수행하며, 동일한 스레드에서 예약된 APC(비동기 프로시저 호출)에 의해 중단될 수 있습니다. 동일한 스레드에서 지속적인 차단 Winsock 호출을 중단한 APC 내에서 또 다른 차단 Winsock 호출을 실행하면 정의되지 않은 동작이 발생하며 Winsock 클라이언트에서 시도해서는 안 됩니다.
 

예제 코드

다음 코드 샘플에서는 getsockopt 함수를 사용하는 방법을 보여 줍니다.
#include <stdio.h>
#include "winsock2.h"
#include <windows.h>

void main() {

  //---------------------------------------
  // Declare variables
  WSADATA wsaData;
  SOCKET ListenSocket;
  sockaddr_in service;

  //---------------------------------------
  // Initialize Winsock
  int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
  if( iResult != NO_ERROR )
    printf("Error at WSAStartup\n");

  //---------------------------------------
  // Create a listening socket
  ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
  if (ListenSocket == INVALID_SOCKET) {
    printf("Error at socket()\n");
    WSACleanup();
    return;
  }

  //---------------------------------------
  // 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);
 
  if ( bind( ListenSocket,(SOCKADDR*) &service, sizeof(service) )  == SOCKET_ERROR ) {
    printf("bind failed\n");
    closesocket(ListenSocket);
    return;
  }

  //---------------------------------------
  // Initialize variables and call getsockopt. 
  // The SO_ACCEPTCONN parameter is a socket option 
  // that tells the function to check whether the 
  // socket has been put in listening mode or not. 
  // The various socket options return different
  // information about the socket. This call should
  // return 0 to the optVal parameter, since the socket
  // is not in listening mode.
  int optVal;
  int optLen = sizeof(int);

  if (getsockopt(ListenSocket, 
    SOL_SOCKET, 
    SO_ACCEPTCONN, 
    (char*)&optVal, 
    &optLen) != SOCKET_ERROR)
    printf("SockOpt Value: %ld\n", optVal);

  //---------------------------------------
  // Put the listening socket in listening mode.
  if (listen( ListenSocket, 100 ) == SOCKET_ERROR) {
    printf("error listening\n");
  } 

  //---------------------------------------
  // Call getsockopt again to verify that 
  // the socket is in listening mode.
  if (getsockopt(ListenSocket, 
    SOL_SOCKET, 
    SO_ACCEPTCONN, 
    (char*)&optVal, 
    &optLen) != SOCKET_ERROR)
    printf("SockOpt Value: %ld\n", optVal);

  WSACleanup();
  return;
}

IrDA 소켓에 대한 참고 사항

  • Af_irda.h 헤더 파일은 명시적으로 포함되어야 합니다.
  • Windows는 기본 트랜시버 드라이버가 IrDA 프로토콜 스택을 사용하여 초기화하지 못했음을 나타내기 위해 WSAENETDOWN 을 반환합니다.
  • IrDA는 다음과 같은 몇 가지 특수 소켓 옵션을 지원합니다.
    Type 의미
    IRLMP_ENUMDEVICES *DEVICELIST 범위 내 디바이스에 대해 설명합니다.
    IRLMP_IAS_QUERY *IAS_QUERY IAS 특성을 검색합니다.
     

IrDA 소켓 연결을 시작하려면 먼저 사용 가능한 모든 IrDA 디바이스 목록을 반환하는 getsockopt(,,IRLMP_ENUMDEVICES,,) 함수 호출을 수행하여 디바이스 주소를 가져와야 합니다. 함수 호출에서 반환된 디바이스 주소는 SOCKADDR_IRDA 구조로 복사되며, 이 구조체는 connect 함수 호출에 대한 후속 호출에서 사용됩니다.

검색은 다음 두 가지 방법으로 수행할 수 있습니다.

  1. 먼저 IRLMP_ENUMDEVICES 옵션을 사용하여 getsockopt 함수 호출을 수행하면 각 유휴 어댑터에서 단일 검색이 실행됩니다. 검색된 디바이스 및 캐시된 디바이스(활성 어댑터)의 목록이 즉시 반환됩니다.

    다음 코드에서는 이 방법을 보여 줍니다.

    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <af_irda.h>
    #include <stdio.h>
    #include <windows.h>
    
    // link with Ws2_32.lib
    
    int __cdecl main()
    {
    
        //-----------------------------------------
        // Declare and initialize variables
        WSADATA wsaData;
    
        int iResult;
        int i;
        DWORD dwError;
    
        SOCKET Sock = INVALID_SOCKET;
    
    #define DEVICE_LIST_LEN    10
    
    
        SOCKADDR_IRDA DestSockAddr = { AF_IRDA, 0, 0, 0, 0, "SampleIrDAService" };
    
        unsigned char DevListBuff[sizeof (DEVICELIST) -
                                  sizeof (IRDA_DEVICE_INFO) +
                                  (sizeof (IRDA_DEVICE_INFO) * DEVICE_LIST_LEN)];
    
        int DevListLen = sizeof (DevListBuff);
        PDEVICELIST pDevList;
    
        pDevList = (PDEVICELIST) & DevListBuff;
    
        // Initialize Winsock
        iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
        if (iResult != 0) {
            printf("WSAStartup failed: %d\n", iResult);
            return 1;
        }
    
        Sock = socket(AF_IRDA, SOCK_STREAM, 0);
        if (Sock == INVALID_SOCKET) {
            dwError = WSAGetLastError();
            printf
                ("socket failed trying to create an AF_IRDA socket with error %d\n",
                 dwError);
    
            if (dwError == WSAEAFNOSUPPORT) {
                printf("Check that the local computer has an infrared device\n");
                printf
                    ("and a device driver is installed for the infrared device\n");
            }
            WSACleanup();
            return 1;
        }
        // Sock is not in connected state
        iResult = getsockopt(Sock, SOL_IRLMP, IRLMP_ENUMDEVICES,
                             (char *) pDevList, &DevListLen);
        if (iResult == SOCKET_ERROR) {
            printf("getsockopt failed with error %d\n", WSAGetLastError());
            WSACleanup();
            return 1;
        }
    
        if (pDevList->numDevice == 0) {
            // no devices discovered or cached
            // not a bad idea to run a couple of times
            printf("No IRDA devices were discovered or cached\n");
        } else {
            // one per discovered device
            for (i = 0; i < (int) pDevList->numDevice; i++) {
                // typedef struct _IRDA_DEVICE_INFO
                // {
                //     u_char    irdaDeviceID[4];
                //     char      irdaDeviceName[22];
                //     u_char    irdaDeviceHints1;
                //     u_char    irdaDeviceHints2;
                //     u_char    irdaCharSet;
                // } _IRDA_DEVICE_INFO;
    
                // pDevList->Device[i]. see _IRDA_DEVICE_INFO for fields
                // display the device names and let the user select one
            }
        }
    
        // assume the user selected the first device [0]
        memcpy(&DestSockAddr.irdaDeviceID[0], &pDevList->Device[0].irdaDeviceID[0],
               4);
    
        iResult = connect(Sock, (const struct sockaddr *) &DestSockAddr,
                          sizeof (SOCKADDR_IRDA));
        if (iResult == SOCKET_ERROR) {
            printf("connect failed with error %d\n", WSAGetLastError());
        } else
            printf("connect to first IRDA device was successful\n");
    
        WSACleanup();
        return 0;
    }
    
    
  2. IrDA 디바이스 주소 검색을 수행하는 두 번째 방법은 지연 검색을 수행하는 것입니다. 이 방법에서 검색된 디바이스가 스택에서 실행한 마지막 검색의 변경 내용을 나열할 때까지 애플리케이션에 알림이 표시되지 않습니다.
이전 테이블의 Type 열에 표시된 DEVICELIST 구조체는 확장 가능한 디바이스 설명 배열입니다. IrDA는 지정된 버퍼에 들어갈 수 있는 만큼의 디바이스 설명을 채웁니다. 디바이스 설명은 sockaddr_irda 구조를 형성하는 데 필요한 디바이스 식별자와 디바이스를 설명하는 표시 가능한 문자열로 구성됩니다.

이전 테이블의 Type 열에 표시된 IAS_QUERY 구조체는 피어 디바이스의 IAS 데이터베이스에서 단일 클래스의 단일 특성을 검색하는 데 사용됩니다. 애플리케이션은 쿼리할 디바이스 및 클래스와 특성 및 특성 유형을 지정합니다. 디바이스는 이전에 getsockopt(IRLMP_ENUMDEVICES)를 호출하여 얻은 것입니다. 애플리케이션은 반환된 매개 변수에 필요한 크기의 버퍼를 할당해야 합니다.

여러 수준 소켓 옵션은 IrDA에 의미가 없습니다. SO_LINGER 및 SO_DONTLINGER만 특별히 지원됩니다.

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

WSAConnect

WSAGetLastError

WSAIoctl

WSASetLastError

Winsock 함수

ioctlsocket

Recv

setsockopt

socket