본문 바로가기

네트워크/리눅스 기반 강의

2010년 12월 21일 화요일 소켓 옵션을 변경하는 함수(수업중)

소켓의 다양한 옵션

소켓의 타입 변경
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main()
{
  int tcp_sock, udp_sock;
  int sock_type=-1;
  socklen_t optlen;
  int state;

  optlen=sizeof(sock_type);
  tcp_sock=socket(PF_INET, SOCK_STREAM, 0);
  udp_sock=socket(PF_INET, SOCK_DGRAM, 0);

  printf("SOCK_STREAM : %d \n", SOCK_STREAM);
  printf("SOCK_DGRAM  : %d \n", SOCK_DGRAM);

  state=getsockopt(tcp_sock, SOL_SOCKET, SO_TYPE, &sock_type, &optlen);
  if(state)
  {
    printf("tcp getsockopt error");
  }
  printf("첫번째 소켓의 타입은 [%d]\n", sock_type);
  
  state=getsockopt(udp_sock, SOL_SOCKET, SO_TYPE, &sock_type, &optlen);
  if(state)
  {
    printf("udp getsockopt error");
  }
  printf("두번째 소켓의 타입은 [%d]\n", sock_type);

  return 0;
}
소켓 버퍼의 크기 변경
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>

int main()
{
  int sock;
  int snd_buf=500;
  int rcv_buf=1000;

  int state;
  socklen_t len;

  sock=socket(PF_INET, SOCK_STREAM, 0);

  /* 입출력 버퍼 크기 설정 */
  state=setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcv_buf, sizeof(rcv_buf));
  if(state)
  {
    printf("rcv setsockopt error");
  }

  state=setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_buf, sizeof(snd_buf));
  if(state)
  {
    printf("snd setsockopt error");
  }

  /* 입출력 버퍼 크기 추출 */
  len=sizeof(rcv_buf);
  state=getsockopt(sock, SOL_SOCKET,SO_RCVBUF, &rcv_buf, &len);
  if(state)
  {
    printf("rcv getsockopt error");
  }

  len=sizeof(snd_buf);
  state=getsockopt(sock, SOL_SOCKET,SO_SNDBUF, &snd_buf, &len);
  if(state)
  {
    printf("snd getsockopt error");
  }

  printf("데이터 입력받기 위한 소켓의 버퍼 크기 : [%d]\n", rcv_buf);
  printf("데이터 출력받기 위한 소켓의 버퍼 크기 : [%d]\n", snd_buf);

  return 0;
}
소켓 옵션을 변경할때는 setsockopt()함수를 사용한다. 원형은 다음과 같다.
int setsockopt(int s, int level, int opt. const char *optval, int optlen);
s : 옵션을 바꿀 소켓 번호
level : 프로토콜 레벨(일반적인 옵션 일 경우 SOL_SOCKET, IP프로토콜 일 경우 IPPROTO_IP,
        TCP에 관한 내용 일 경우 IPPROTO_TCP를 선택)
opt : 선택할 옵션(맨 위의 표 참조)
*optval : 옵션 지정에 필요한 값의 포인터 
optlen : *optval의 크기

소켓의 현재 옵션 값을 알아내려면 getsockopt() 함수를 사용한다. 원형은 다음과 같다.
int getsockopt(int s, int level, int opt, const char *optval, int *len);
setsockopt() 함수와 같다. 단 optval,len은 입력인자가 아닌 값을 얻는 출력 인자가 된다.