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 상태에서 포트를 빠르게 재사용할 수 있다.
'프로그래밍 > C' 카테고리의 다른 글
고해상도 타이머 QueryPerformanceFrequency, QueryPerformanceCounter (0) | 2023.10.09 |
---|---|
윈도우 소켓 ] 논블로킹 소켓, ioctlsocket, 소켓 함수의 리턴 조건과 WSAEWOULDBLOCK이 리턴되는 상황 (0) | 2023.10.02 |
윈도우 소켓 ] connect 비동기로 처리하기 (0) | 2023.09.30 |
C] strstr 함수 구현 (0) | 2023.09.15 |
C ] Data Types Range (0) | 2023.09.15 |