소켓 옵션 변경
what? 무엇?
소켓 프로그램에서 소켓의 디폴트 설정 값을 그래도 사용하는 경우가 아니라 TCP/IP 프로토콜의 세부적인 기능을 활용하거나 소켓의 동작의 특성을 변경할 수 있다. 이때, 사용하는 것을 소켓 옵션이라고 한다.
HOW? 어떻게 사용?
소켓 옵션을 변경하는 방법과 멀티캐스트 패킷을 송수신하는 방법 및 멀티캐스트를 이용한 채팅 프로그램을 작성하며 알아보자.
*소켓옵션 변경 함수
int getsockopt(int s int level., int opt, const char *optval, int *optlen);
- 소켓 s에 지정되어있는 옵션 값을 알아내기 위해 사용하는 getsockopt
int setsockopt(int s, int level, int opt, const char *optval, int optlen);
-소켓 s의 옵션을 변경하기 위해서 사용하는 setsockopt
<설명>
-level : 프로토콜 레벨을 지정(socket레벨 옵션이면 SOL_SOCKET, IP프로토콜에 관한 옵션이면 IPPROTO_IP를 사용, TCP에 관한 옵션이면 IPPROTO_TCP를 선택)
- opt : opt인자는 변경할 또는 읽을 옵션을 지정
- optval : 지정하려는 또는 읽으려는 옵션 값을 가리키는 포인터
- optlen : 옵션의 길이를 나타내는 정수값
=> 옵션 중 어떤 상태의 선택 또는 취소로 둘중 하나를 택하는 옵션이 있다.
옵션을 지정할 때 1이면 선택이고 0이면 취소
WHY? 왜필요?
소켓의 기본 디폴트 설정 값이 아니라 세부적인 기능 및 동작의 특정을 조절하고 싶을 경우 소켓 옵션을 사용한다.
<소켓 옵션 변경 예>
IP레벨의 옵션중 ttl값을 출력해보고 TTL값을 32로 바꾸는 코드를 작성해보자.
int ttl, optlen;
int ttl, optlen;
getsockopt(s, IPPROTO_IP, IP_TTL, &ttl, &optlen);
printf("TTL = %d\n", ttl);
ttl=32;
setsockopt(s, IPPROTO_IP, IP_TTL, &&ttl, sizeof(ttl));
printf("TTL = %d\n", *ttl);
소켓레벨옵션 중 keep alive 동작을 선택하는 코드를 작성해보자.
int set=1;
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &set, sizeof(set));
TCP 소켓을 개설하고 디폴트 수신 버퍼의 크기를 확인후 사용자가 임의의 크기(여기서는 1024)로 변경해보는 코드를 작성해보자.
#include <stdio.h
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main()
{
int s;
int val, len;
if((s = socket(AF_INET, SOCK_STREAM, 0))<0){
perror("socket fail");
exit(1);
}
len = sizeof(val);
if(getsockopt(s, SOL_SOCKET, SO_RCVBUF, &val, &len)<0){
perror("socket fail");
exit(1);
}
printf("default value : %d\n, val);
val= 1024;
setsockopt(s, SOL_SOCKET, SO_RCVBUF, &val, sizeof(val));
getsockopt(s, SOL_SOCKET, SO)RCVBUF, &val, &len);
printf("1024로 변경한 수신버퍼의 크기 : %d\n", val);
return 0;
}