네트워크프로그래밍

소켓 옵션 변경

백수진 2021. 5. 27. 16:06

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;
}