TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다. 8장. 소켓 옵션 TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
개요 (1) 소켓 프로그래밍 모델 응용 프로그램 TCP IP UDP IrDA Bluetooth ... 소켓 소켓 코드 프로토콜 구현 코드
개요 (2) 소켓 옵션 소켓 옵션의 종류 소켓 함수의 기본 동작을 변경 ① 소켓 코드가 처리하는 옵션 소켓 코드와 프로토콜 구현 코드를 세부적으로 제어 소켓 옵션의 종류 ① 소켓 코드가 처리하는 옵션 옵션을 설정하면 소켓 코드에서 해석하고 처리 ② 프로토콜 구현 코드가 처리하는 옵션 옵션을 설정하면 프로토콜 구현 코드에서 해석하고 처리
개요 (3) 소켓 옵션 설정(=변경)하기 int setsockopt ( SOCKET s, int level, int optname, const char *optval, int optlen ) ; 성공: 0, 실패: SOCKET_ERROR
개요 (4) 현재 설정된 소켓 옵션 값 얻기 int getsockopt ( SOCKET s, int level, int optname, char *optval, int *optlen ) ; 성공: 0, 실패: SOCKET_ERROR
소켓 옵션의 종류 (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 주소, 포트 번호) 재사용 허용 여부
소켓 옵션의 종류 (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{} 멀티캐스트 그룹 가입과 탈퇴
소켓 옵션의 종류 (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{} 멀티캐스트 그룹 가입과 탈퇴
소켓 옵션의 종류 (4) level = IPPROTO_TCP optname optval get set 설명 TCP_NODELAY BOOL . Nagle 알고리즘 작동 여부
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()");
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()");
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;
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()");
SO_LINGER 옵션 (3) 옵션 값에 따른 closesocket() 함수 동작 ① closesocket() 함수는 곧바로 리턴하되, 송신 버퍼의 데이터를 백그라운드로 모두 보내고 TCP 연결을 정상 종료 ② closesocket() 함수는 곧바로 리턴하되, 송신 버퍼의 데이터를 삭제하고 TCP 연결을 강제 종료 ③ 송신 버퍼의 데이터를 모두 보내고 TCP 연결을 정상 종료한 후 closesocket() 함수가 리턴. 일정 시간 안에 송신 버퍼의 데이터를 모두 보내지 못하면 TCP 연결을 강제 종료한 후 closesocket() 함수가 리턴. 이때 송신 버퍼에 남은 데이터는 삭제 struct linger{} closesocket() 함수 동작 추가 설명 l_onoff l_linger 사용 안함 ①과 동일 closesocket() 함수의 기본 동작 1 ②와 동일 양수 ③과 동일
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()");
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()");
SO_REUSEADDR 옵션 용도 목적 현재 사용 중인 IP 주소와 포트 번호를 재사용 현재 사용 중인 IP 주소와 포트 번호를 이용해 bind() 함수를 (성공적으로) 호출할 수 있음 목적 TCP 서버 종료 후 재실행 시 bind( ) 함수에서 오류가 발생하는 일을 방지 여러 IP 주소를 보유한 호스트에서 같은 기능의 서버를 IP 주소별로 따로 운용할 수 있게 함 멀티캐스팅 응용 프로그램이 같은 포트 번호를 사용할 수 있게 함
Thank you www.hanb.co.kr TCP/IP 윈도우 소켓 프로그래밍