TCP/IP 소켓 프로그래밍 09. 소켓의 다양한 옵션  시스템프로그래밍 

2013.03.20. 19:32  수정  삭제

복사http://blog.naver.com/pwk0810/40184570425

전용뷰어 보기

09-1. 소켓의 옵션과 입출력 버퍼의 크기

 

+ 소켓의 다양한 옵션

 

  • 소켓의 옵션은 계층별로 분류
  • IPROTO_IP 레벨의 옵션들은 IP 프로토콜 에 관련 된 사항
  • SOL_SOCKET : 소켓에 대한 일반적인 옵션
+ getsockopt& setsockopt

  • int getsockopt(int sock, int level, int optname , void *optval , socklen_t *optlen );
    • sock ( 옵션 확인을 위한 소켓의 파일 디스크립터 전달
    • level : 옵션의 프로토콜 레벨
    • optname : 확인할 옵션의 이름 전달
    • optval :확인 결과의 저장을 위한 버퍼의 주소값 전달
    • optlne :optval 로 전달된 주소 값의 버퍼 크기를 담고 있는 변수의 주소값
  • int setsockopt(int sock, int level, int optname , const void* optval,  socklen_t optlen );

  • int state = getsockopt(tcp_sock(int) , SOL_SOCKET, SO_TYPE , (void*) &sock_type , &optlen); 
    • SO_TYPE 은 확인만 가능하고 변경이 불가능한 옵션이다.
    • SO_TYPE - 소켓의 타입은 소켓 생성시 한번 결정되는 변경이 불가능하다.
+SO_SENDBUF& SO_RCVBUF
  • SOCKET  이 생성되면 기본적으로 입력 버퍼와 출력 버퍼가 생성된다.
  • 입출력 버퍼 크기 확인과 변경
  • int state = getsockopt(sock (int) , SOL_SOCKET , SO_SNDBUF, (void*) & snd_buf(int), &len( int) ;
  • printf("Output buffer size : %d\n" , snd_buf);

  • int state = getsockopt(sock (int) , SOL_SOCKET , SO_RCVBUF, (void*) & recv_buf(int), &len( int) ;
  • printf("Input buffer size : %d\n" , recv_buf);

  • 입출력 버퍼 크기 변경
  • int snd_buf = 1024*3 int rcv_buf = 1024*3;
  • int state = setsockopt(sock, SOL_SOCKET , SO_RCVBUF , (void*) &rcv_buf, sizeof(rcv_bu));
  • int state = setsockopt(sock, SOL_SOCKET , SO_SNDBUF , (void*) &snd_buf, sizeof(snd_bu));

  • 이에 대한 출력결과는 기대와는 다른 양상을 보이는데 이는 , 
  • setsockopt 함수 호출을 통해서 버퍼의 크기에 대한 우리의 요구사항을 전달할 뿐이다.

09-2. SO_REUSEADDR
  • SO_RESUEADDR 옵션 , 그리고 그와 관련이 있는 Time-Wait 상태는 상대적으로 중요
+ 주소 할당 에러(Binding Error ) 발생
  • 연결 해제 과정에서 Four-way handshaking 이후에 소켓이 바로 소멸되지 않고 Time-Wait 상태라는 것을  일정 시간 거친다는것을 알수 있다.
  • Time-Wait 은 클라이언트와 서버와 상관없이 거치게 되며, 먼저 연결의 종료를 요청하면 해당 소켓은 반드시 Time-Wait 상태를 거친다.
  • 그런 클라이언트는 소켓의 PORT 번호를 임의로 할당하기 때문에 ( 실행될때 마다 PORT  번호가 유동적으로 할당 ) Time-Wait  상태를 신경 쓰지 않아도 된다.
  • int optlen , option;
  • optlen = sizeof(option);
  • option = true;
  • setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, (void*)&option, optlen );

+ 주소의 재할당
  • SO_REUSEADDR 의 상태를 변경
    • Time-Wait 상태에 있는 소켓에 할당되어 있는 PORT 번호를 새로 시작하는 소켓에 할당되게 끔 할 수 있다.
    • 디폴트 값은 0 : Time-Wait 상태에 있는 소켓의 port 번호는 할당이 불가능
    • 1 : 할당 가능
09-3. TCP_NODELAY
+ 네이글 알고리즘
  • 네트워크 상에서 돌아다니는 패킷들의 흘러 넘침을 막기 위해 고안된 알고리즘
  • 앞서 전송한 데이터에 대한 ACK 패킷을 받아야만, 다음 데이터를 전송하는 알고리즘이다.
  • Nagle 알고리즘을 적용하는 것보다 데이터의 전송이 빠른 경우도 있는데 
  • '용량이 큰 파일 데이터의 전송' 이 대표적인 예이다.
  • Nagel 알고리즘 의 중단
  • int opt_val = 1;
  • setsockopt(sock,  IPROTO_TCP, TCP_NODELAY, (void*) &opt_val , sizeof(opt_val));

09-04 윈도우 기반으로 구현하기

 

Posted by 뉴암스테르담
l