Download presentation
Presentation is loading. Please wait.
Published byAnne Leppänen Modified 6년 전
1
인공지능실험실 박사 1학기 장성만 smjang@ai.hannam.ac.kr
TCP/IP Socket Programming… 9장 소켓의 다양한 옵션 인공지능실험실 박사 1학기 장성만
2
목차 소켓의 옵션 SO_SNDBUF & SORCVBUF TCP_NODELAY 윈도우즈 기반으로 구현하기
3
소켓의 옵션 소켓의 옵션
4
소켓의 옵션 소켓의 옵션 열린 소켓 정보의 획득과 반환 Sock : 소켓 번호
#include <sys/types.h> #include <sys/socket.h> Int getsockopt(int sock, int level, int optname, void *optval, socklen_t *option 성공 시 0, 실패시 -1리턴 Sock : 소켓 번호 Level : 확인할 옵션의 프로토콜 레벨을 인자로 전달 SOL_SOCKET Optname : 확인할 옵션의 이름을 전달 Optval : optname으로 얻은 정보를 저장 Optlen : optval의 길이
5
소켓의 옵션 tcp_sock=socket(PF_INET, SOCK_STREAM,0); //tcp 소켓생성
udp_sock=socket(PF_INET, SOCK_DGRAM, 0);//udp소켓 생성 printf("SOCK_STREAM : %d \n", SOCK_STREAM); printf("SOCL_DGRAM : %d \n", SOCK_DGRAM); state=getsockopt(tcp_sock, SOL_SOCKET, SO_TYPE, &sock_type, &option); //소켓헝태 얻기 SO_TYPE if(state) error_handling("getsockopt() error"); printf("첫 번째 소켓의 타입은 %d\n", sock_type); state=getsockopt(udp_sock, SOL_SOCKET, SO_TYPE, &sock_type, &option); printf("두 번째 소켓의 타입은 %d\n", sock_type);
6
SO_SNDBUF & SO_RCVBUF 소켓 생성시의 기본 입출력 버퍼 확인
sock=socket(PF_INET, SOCK_STREAM, 0); //tcp 소켓 생성 len=sizeof(snd_buf); state=getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_buf, &len); //출력 버퍼 크기 확인 if(state) error_handling("getsockopt() error"); len=sizeof(rcv_buf); state= getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcv_buf, &len); //입력 버퍼 크기 확인 printf("데이터 입력을 위한 소켓의 버퍼 크기 : %d \n", rcv_buf); printf("데이터 출력을 위한 소켓의 버퍼 크기 : %d \n", snd_buf);
7
SO_SNDBUF & SO_RCVBUF 소켓 생성시의 기본 입출력 버퍼 변경
state=setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcv_buf, sizeof(rcv_buf)); //출력 버퍼 크기 변경 state = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_buf, sizeof(snd_buf)); //입력 버퍼 크기 변경 len=sizeof(snd_buf); state=getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_buf, &len); if(state) error_handling("getsockopt() error"); len=sizeof(rcv_buf); state=getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcv_buf, &len); printf("데이터 입력을 위한 소켓의 버퍼 크기 : %d \n", rcv_buf); printf("데이터 출력을위한 소켓의 버퍼 크기 : %d \n", snd_buf);
8
SO_REUSEADDR 주소 할당 시 에러(Binding Error)의 발생 SO_REUESADD
시스템이 열린 소켓을 잡고 있기 때문 이 경우 시스템이 열린 소켓을 해제할 때 까지 기다리지 않고 SO_REUSEADD 옵션을 사용하여 bind() 에러 방지 1 2 Ctrl + C로 클라이언트 강제 종료 서버측 bind() 에러가 생기지 않음
9
SO_REUSEADDR 주소 할당 시 에러(Binding Error)의 발생방지 SO_REUESADD
setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
10
SO_REUSEADDR TIME-WAIT 상태 서버
11
SO_REUSEADDR 주소의 재활용 : SO_REUSEADDR 완전한 연결종료를 맺지 못해 길어진 TIME_WAIT
12
TCP_NODELAY Nagle 알고리즘 Nagle알고리즘 기존에 전송한 패킷이 있을경우 Nagle 알고리즘 미적용시
그 패킷에 ACK를 받아야 다음 전송을 진행하는 알고리즘 Nagle 알고리즘 미적용시 전송속도 향상효과 네트워크 트래픽에 부하증가
13
TCP_NODELAY Nagle 알고리즘의 중단요청 TCP_NODELAY 1(TRUE)로 설정 : Nagel 알고리즘 미적용
0(FALSE)로 설정 : Nagel 알고리즘 적용 /* 디폴트 nagle알고리즘 설정 상태 확인 */ state=getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt_val, &opt_len); printf(" 디폴트 nagel알고리즘 : %s \n", opt_val ? "비설정" : "설정"); /* nagel 알고리즘을 disable 시킨다*/ opt_val=TRUE; state=setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt_val,sizeof(opt_val)); /* 변경된 nagle 알고리즘 확인 */ getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt_val, &opt_len); printf("변경된 nagle 알고리즘 : %s \n",opt_val ? "비설정" : "설정");
14
윈도우 기반으로 구현하기 옵션의 설정과 참조 #include <winsock2.h> Int getsockopt(
SOCKET s, //설정 상태를 변경하고자 하는 소켓의 핸들을 인자로 전달 int level, //변경할 옵션의 프로토콜 레벨을 인자로 전달 int optname, //변경할 옵션의 이름 전달 char FAR *optval //변경할 옵션의 값을 저장한 변수의 포인터를 전달 int FAR *optlen //optval 포인터가 가리키는 버퍼의 크기를 전달 성공 시 0, 실패시 SOCKET_ERROR 리턴 #include <winsock2.h> Int setsockopt( SOCKET s, //설정 상태를 변경하고자 하는 소켓의 핸들을 인자로 전달 int level, //변경할 옵션의 프로토콜 레벨을 인자로 전달 int optname, //변경할 옵션의 이름 전달 const char FAR *optval //변경할 옵션의 값을 저장한 버퍼의 포인터를 전달 int optlen //optval //전달되는 옵션 값의 바이트 단위 길이를 인자로 전달 성공 시 0, 실패시 SOCKET_ERROR 리턴
15
참고문헌 “UNIX Network Programming”, W.Richard Stevens
“TCP/IP 소켓 프로그래밍”, 윤성우 저
16
Q & A
Similar presentations