본문 바로가기
프로그래밍/C

윈도우 소켓 ] 소켓 옵션, setsockopt, getsockopt, SOL_SOCKET 옵션들

by eteo 2023. 10. 1.

 

 

 

 

setsockopt

 

setsockopt 함수는 소켓 옵션을 설정하는 데 사용된다.

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
  • sockfd : 옵션을 설정할 대상이 되는 소켓을 식별하는 데 사용되는 소켓 디스크립터로, 소켓을 생성하고 열 때 반환되는 정수값이다.
  • level: 설정하려는 옵션이 어느 레벨에 속하는지 지정한다. 주로 SOL_SOCKET 레벨을 사용하고, 특정 프로토콜 레벨 옵션인 경우, IPPROTO_IP, IPPROTO_IPV6, IPPROTO_TCP 등을 사용할 수 있다.
  • optname: 설정하려는 옵션의 이름을 지정한다. 예를 들어, SO_BROADCAST, SO_KEEPALIVE, SO_SNDBUF 등이 해당된다.
  • optval: 설정하려는 옵션의 값을 가지는 메모리 블록을 가리키는 포인터로, 각 옵션에 따라 다른 데이터 타입을 요구하기 때문에 void *로 전달한다.
  • optlen: optval의 길이를 나타낸다. sizeof() 연산자를 사용하여 옵션 값의 크기를 계산해 전달한다.

 

사용 예시.

int broadcastOption = 1;
int result = setsockopt(socketDescriptor, SOL_SOCKET, SO_BROADCAST, &broadcastOption, sizeof(broadcastOption));

 

 

 

 

 

getsockopt

 

getsockopt 함수는 소켓 옵션 값을 가져오는데 사용된다.

 

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
  • sockfd: 소켓 디스크립터
  • level: 옵션 레벨
  • optname: 옵션 이름
  • optval: 가져온 옵션 값을 저장할 메모리 블록을 가리키는 포인터, getsockopt 함수가 호출된 후 이 포인터가 가리키는 메모리에 옵션 값이 저장된다.
  • optlen: optval에 저장할 옵션 값의 최대 길이를 나타내는 포인터로, 함수가 호출된 후에는 실제로 가져온 옵션 값의 길이로 설정된다.

 

 

사용 예시.

 

int sendBufferSize;
socklen_t optlen = sizeof(sendBufferSize);
int result = getsockopt(socketDescriptor, SOL_SOCKET, SO_SNDBUF, &sendBufferSize, &optlen);

 

 

 

 

 

 

SOL_SOCKET 레벨 옵션

 

  • SO_BROADCAST 
    • optval 타입: int
    • 이 옵션은 소켓이 브로드캐스트 메시지를 보낼 수 있도록 허용한다. optval을 1로 설정하면 브로드캐스트가 허용되고, 0으로 설정하면 비활성화된다.
    • UDP 소켓에만 사용 가능하다.
  • SO_KEEPALIVE
    • optval 타입: int
    • 이 옵션은 소켓이 연결이 유효한지 주기적으로(기본2시간 간격) TCP 패킷을 보내 확인하여 응답이 없으면 연결을 종료한다. optval을 1로 설정하면 활성화되고, 0으로 설정하면 비활성화된다.
    • TCP 소켓에만 사용 가능하다. 보통 listen 소켓에 이 옵션을 설정하면 accept로 리턴되는 소켓도 자동으로 이 옵션이 설정된 상태로 생성된다.
  • SO_LINGER
    • optval 타입: struct linger
    • 이 옵션은 소켓 송신 버퍼에 미전송 데이터가 있을  때 closesocket 함수의 리턴 지연 시간을 설정한다. optval은 struct linger 타입의 구조체로 지정하며, 구조체의 l_onoff 멤버를 1로 설정하고 l_linger 멤버를 원하는 시간(초)으로 설정한다.
    • TCP 소켓에만 사용한다.
  • SO_SNDBUF
    • optval 타입: int
    • 이 옵션은 소켓의 송신 버퍼 크기를 설정한다. optval에는 원하는 송신 버퍼 크기(바이트 단위)를 지정한다.
  • SO_RCVBUF
    • optval 타입: int
    • 이 옵션은 소켓의 수신 버퍼 크기를 설정한다. optval에는 원하는 수신 버퍼 크기(바이트 단위)를 지정한다.
  • SO_SNDTIMEO
    • optval 타입: struct timeval
    • 이 옵션은 send(), sendto() 등 송신 함수에 대한 타임아웃 시간을 설정한다. optval은 struct timeval 구조체로, tv_sec 멤버에 초 단위의 시간을, tv_usec 멤버에 마이크로초 단위의 시간을 설정한다.
  • SO_RCVTIMEO
    • optval 타입: struct timeval
    • 이 옵션은 recv(), recvfrom() 등 수신 함수에 대한 타임아웃 시간을 설정한다. optval은 struct timeval 구조체로, tv_sec 멤버에 초 단위의 시간을, tv_usec 멤버에 마이크로초 단위의 시간을 설정한다.
  • SO_REUSEADDR
    • optval 타입: int 설명: 이 옵션은 소켓이 이전에 사용한 주소와 포트 번호를 재사용할 수 있도록 허용한다. optval을 1로 설정하면 활성화되고, 0으로 설정하면 비활성화된다.
    • 보통 서버가 종료되면 해당 포트 번호는 잠시 동안 운영체제에 의해 TIME_WAIT 상태로 설정되는데 이 상태는 해당 포트를 다시 사용해 bind()할 수 없다. 이런 경우를 대비하기 위해 SO_REUSEADDR 함수를 사용하면 서버 종료 이후 바로 재시작 시TIME_WAIT 상태에서 포트를 빠르게 재사용할 수 있다.