Download presentation
Presentation is loading. Please wait.
1
TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
8장. 소켓 옵션 TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
2
개요 (1) 소켓 프로그래밍 모델 응용 프로그램 TCP IP UDP IrDA Bluetooth ... 소켓 소켓 코드 프로토콜
구현 코드
3
개요 (2) 소켓 옵션 소켓 옵션의 종류 소켓 함수의 기본 동작을 변경 ① 소켓 코드가 처리하는 옵션
소켓 코드와 프로토콜 구현 코드를 세부적으로 제어 소켓 옵션의 종류 ① 소켓 코드가 처리하는 옵션 옵션을 설정하면 소켓 코드에서 해석하고 처리 ② 프로토콜 구현 코드가 처리하는 옵션 옵션을 설정하면 프로토콜 구현 코드에서 해석하고 처리
4
개요 (3) 소켓 옵션 설정(=변경)하기 int setsockopt ( SOCKET s, int level,
int optname, const char *optval, int optlen ) ; 성공: 0, 실패: SOCKET_ERROR
5
개요 (4) 현재 설정된 소켓 옵션 값 얻기 int getsockopt ( SOCKET s, int level,
int optname, char *optval, int *optlen ) ; 성공: 0, 실패: SOCKET_ERROR
6
소켓 옵션의 종류 (1) level = SOL_SOCKET optname optval get set 설명
SO_BROADCAST BOOL . 브로드캐스팅 데이터 전송 허용 여부 SO_KEEPALIVE 주기적으로 연결 상태 확인 여부 SO_LINGER linger{} 소켓 송신 버퍼에 미전송 데이터가 있을 때 closesocket() 함수의 리턴 지연 시간 설정 SO_SNDBUF SO_RCVBUF int 소켓 송/수신 버퍼의 크기 설정 SO_SNDTIMEO SO_RCVTIMEO 데이터 송/수신 함수 호출 시 타임아웃 값 설정 SO_REUSEADDR 지역 주소(IP 주소, 포트 번호) 재사용 허용 여부
7
소켓 옵션의 종류 (2) level = IPPROTO_IP optname optval get set 설명 IP_HDRINCL
BOOL . 데이터 송신 시 IP 헤더 직접 포함 여부 IP_TTL int IP 패킷의 TTL(time-to-live) 값 설정 IP_MULTICAST_IF IN_ADDR{} 멀티캐스트 패킷을 보낼 인터페이스 선택 IP_MULTICAST_TTL 멀티캐스트 패킷의 TTL 값 설정 IP_MULTICAST_LOOP 멀티캐스트 패킷의 루프백 여부 IP_ADD_MEMBERSHIP IP_DROP_MEMBERSHIP ip_mreq{} 멀티캐스트 그룹 가입과 탈퇴
8
소켓 옵션의 종류 (3) level = IPPROTO_IPV6 optname optval get set 설명
IPV6_HDRINCL BOOL . 데이터 송신 시 IP 헤더 직접 포함 여부 IPV6_UNICAST_HOPS int IP 패킷의 TTL(time-to-live) 값 설정 IPV6_MULTICAST_IF DWORD 멀티캐스트 패킷을 보낼 인터페이스 선택 IPV6_MULTICAST_HOPS 멀티캐스트 패킷의 TTL 값 설정 IPV6_MULTICAST_LOOP 멀티캐스트 패킷의 루프백 여부 IPV6_ADD_MEMBERSHIP IPV6_DROP_MEMBERSHIP ipv6_mreq{} 멀티캐스트 그룹 가입과 탈퇴
9
소켓 옵션의 종류 (4) level = IPPROTO_TCP optname optval get set 설명
TCP_NODELAY BOOL . Nagle 알고리즘 작동 여부
10
SO_BROADCAST 옵션 용도 사용 예 브로드캐스트 데이터 전송 기능 활성화
TCP 소켓에는 사용할 수 없고 UDP 소켓에만 사용 가능 사용 예 BOOL bEnable = TRUE; retval = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&bEnable, sizeof(bEnable)); if(retval == SOCKET_ERROR) err_quit("setsockopt()");
11
SO_KEEPALIVE 옵션 용도 TCP 프로토콜 수준에서 연결 여부를 확인하려고 상대 TCP에 주기적으로(약 2시간 간격) TCP 패킷을 보냄 사용 예 BOOL bEnable = TRUE; retval = setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&bEnable, sizeof(bEnable)); if(retval == SOCKET_ERROR) err_quit("setsockopt()");
12
SO_LINGER 옵션 (1) 용도 옵션 값 closesocket() 함수의 동작 변경
send(sock, ...); // 데이터를 보낸다. closesocket(sock); // 소켓을 닫는다. struct linger { u_short l_onoff; /* option on/off */ u_short l_linger; /* linger time */ }; typedef struct linger LINGER;
13
SO_LINGER 옵션 (2) 사용 예 LINGER optval;
optval.l_onoff = 1; /* linger on */ optval.l_linger = 10; /* linger time = 10초 */ retval = setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&optval, sizeof(optval)); if(retval == SOCKET_ERROR) err_quit("setsockopt()");
14
SO_LINGER 옵션 (3) 옵션 값에 따른 closesocket() 함수 동작
① closesocket() 함수는 곧바로 리턴하되, 송신 버퍼의 데이터를 백그라운드로 모두 보내고 TCP 연결을 정상 종료 ② closesocket() 함수는 곧바로 리턴하되, 송신 버퍼의 데이터를 삭제하고 TCP 연결을 강제 종료 ③ 송신 버퍼의 데이터를 모두 보내고 TCP 연결을 정상 종료한 후 closesocket() 함수가 리턴. 일정 시간 안에 송신 버퍼의 데이터를 모두 보내지 못하면 TCP 연결을 강제 종료한 후 closesocket() 함수가 리턴. 이때 송신 버퍼에 남은 데이터는 삭제 struct linger{} closesocket() 함수 동작 추가 설명 l_onoff l_linger 사용 안함 ①과 동일 closesocket() 함수의 기본 동작 1 ②와 동일 양수 ③과 동일
15
SO_SNDBUF, SO_RCVBUF 옵션
용도 소켓의 송신 버퍼와 수신 버퍼 크기 변경 사용 예 int optval, optlen; // 수신 버퍼의 크기를 얻는다. optlen = sizeof(optval); retval = getsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, (char *)&optval, &optlen); if(retval == SOCKET_ERROR) err_quit("getsockopt()"); printf("수신 버퍼 크기(old) = %d바이트\n", optval); // 수신 버퍼의 크기를 두 배로 늘린다. optval *= 2; retval = setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, (char *)&optval, sizeof(optval)); if(retval == SOCKET_ERROR) err_quit("setsockopt()");
16
SO_SNDTIMEO, SO_RCVTIMEO 옵션
용도 데이터 전송 함수가 작업 완료와 상관없이 일정 시간 후 리턴하게 함 사용 예 int optval = 3000; retval = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&optval, sizeof(optval)); if(retval == SOCKET_ERROR) err_quit("setsockopt()");
17
SO_REUSEADDR 옵션 용도 목적 현재 사용 중인 IP 주소와 포트 번호를 재사용
현재 사용 중인 IP 주소와 포트 번호를 이용해 bind() 함수를 (성공적으로) 호출할 수 있음 목적 TCP 서버 종료 후 재실행 시 bind( ) 함수에서 오류가 발생하는 일을 방지 여러 IP 주소를 보유한 호스트에서 같은 기능의 서버를 IP 주소별로 따로 운용할 수 있게 함 멀티캐스팅 응용 프로그램이 같은 포트 번호를 사용할 수 있게 함
18
Thank you TCP/IP 윈도우 소켓 프로그래밍
Similar presentations