TCP/IP 소켓 프로그래밍 09. 소켓의 다양한 옵션 ![]() ![]()
|
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 윈도우 기반으로 구현하기
'SYSTEM PROGRAMMING' 카테고리의 다른 글
TCP/IP 소켓 프로그래밍 11. 프로세스간 통신의 기본 개념 (0) | 2015.08.05 |
---|---|
TCP/IP 소켓 프로그래밍 10. 멀티 프로세스 기반의 서버 구현 (0) | 2015.08.05 |
TCP/IP 소켓 프로그래밍 04. TCP와 UDP에 대한 이해 (0) | 2015.08.05 |
Real MySQL 7장. 쿼리 작성 및 최적화 (0) | 2015.08.05 |
Real MySQL 6장. 실행 계획 (0) | 2015.08.05 |