7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다. IPv4와 IPv6 기반 UDP 서버-클라이언트를 작성할 수 있다. 브로드캐스팅의 개념을 이해하고 UDP를 이용해 구현할 수 있다.
TCP와 UDP (1) TCP와 UDP의 공통점 포트 번호를 이용해 주소를 지정 데이터 오류를 체크 IP와 달리 TCP와 UDP는 헤더는 물론이고 데이터에 대한 오류도 체크함 TCP/IP 윈도우 소켓 프로그래밍
TCP와 UDP (2) TCP와 UDP의 차이점 항목 TCP UDP ① 연결형 프로토콜 - 연결 설정 후 통신 가능 비연결형 프로토콜 - 연결 설정 없이 통신 가능 ② 신뢰성 있는 데이터 전송 - 데이터를 재전송함 신뢰성 없는 데이터 전송 - 데이터를 재전송하지 않음 ③ 일대일 통신 일대다 통신 ④ 데이터 경계 구분 안 함 - 바이트 스트림 서비스 데이터 경계 구분함 - 데이터그램 서비스
TCP와 UDP (3) UDP의 특징 연결 설정을 하지 않으므로 connect( ) 함수 불필요 프로토콜 수준에서 신뢰성 있는 데이터 전송을 보장하지 않으므로, 필요하다면 응용 프로그램 수준에서 신뢰성 있는 데이터 전송 기능을 구현해야 함 간단한 소켓 함수 호출 절차만 따르면 다자 간 통신을 쉽게 구현할 수 있음 TCP와 달리 응용 프로그램이 데이터 경계 구분을 위한 작업을 별도로 할 필요가 없음
UDP 서버-클라이언트 동작 원리 (1) UDP 서버-클라이언트 동작 원리 UDP 서버 UDP 클라이언트 #1 대기 통신
UDP 서버-클라이언트 동작 원리 (2) UDP 서버-클라이언트 동작 원리(계속) UDP 서버 UDP 클라이언트 #1 클라이언트 #2 통신 . . . 클라이언트 #n
UDP 서버-클라이언트 예제 (1) UDP 서버-클라이언트 예제 동작 UDP 클라이언트 UDP 서버 fgets() sendto() printf() recvfrom()
UDP 서버-클라이언트 예제 (2) UDP 서버-클라이언트 상태 ① 한 개의 UDP 서버와 한 개의 UDP 클라이언트 통신 (포트 번호:9000) (포트 번호:51835)
UDP 서버-클라이언트 예제 (3) UDP 서버-클라이언트 상태 ② 한 개의 UDP 서버와 두 개의 UDP 클라이언트 클라이언트 #1 클라이언트 #2 통신 (포트 번호:51835) (포트 번호:57385) (포트 번호:9000)
UDP 서버-클라이언트 분석 (1) 소켓 통신을 위해 결정해야 할 요소 ① 프로토콜 ② 지역 IP 주소와 지역 포트 번호 통신 규약. 소켓을 생성할 때 결정 ② 지역 IP 주소와 지역 포트 번호 서버 또는 클라이언트 자신의 주소 ③ 원격 IP 주소와 원격 포트 번호 서버 또는 클라이언트가 통신하는 상대의 주소
UDP 서버-클라이언트 분석 (2) 소켓 데이터 구조체 서버 클라이언트 응용 프로그램 운영체제 네트워크 수신 버퍼 지역 IP 주소 지역 포트 번호 원격 IP 주소 원격 포트 번호 클라이언트 응용 프로그램 운영체제 네트워크 • • • 수신 버퍼
UDP 서버-클라이언트 분석 (3) UDP 서버-클라이언트 모델 ① socket() bind() recvfrom() sendto() closesocket() UDP 서버 UDP 클라이언트 네트워크
UDP 서버-클라이언트 분석 (4) UDP 서버-클라이언트 모델 ② socket() bind() recvfrom() sendto() closesocket() send() recv() UDP 서버 UDP 클라이언트 네트워크 connect()
데이터 전송 함수 (1) sendto() 함수 응용 프로그램 데이터를 운영체제의 송신 버퍼에 복사함으로써 데이터를 전송 소켓의 지역 IP 주소와 지역 포트 번호가 아직 결정되지 않은 상태라면 운영체제가 자동으로 결정! int sendto ( SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen ) ; 성공: 보낸 바이트 수, 실패: SOCKET_ERROR
데이터 전송 함수 (2) sendto() 함수 사용 예 // 소켓 주소 구조체를 수신자의 IP 주소와 포트 번호로 초기화한다. SOCKADDR_IN serveraddr; ... // 송신용 버퍼를 선언하고 데이터를 넣는다. char buf[BUFSIZE]; // sendto() 함수로 데이터를 보낸다. retval = sendto(sock, buf, strlen(buf), 0, (SOCKADDR *)&serveraddr, sizeof(serveraddr)); if(retval == SOCKET_ERROR) 오류 처리; printf("%d바이트를 보냈습니다.\n", retval);
데이터 전송 함수 (3) recvfrom() 함수 운영체제의 수신 버퍼에 도착한 데이터를 응용 프로그램 버퍼에 복사 UDP 패킷 데이터를 한 번에 하나만 읽을 수 있음! int recvfrom ( SOCKET s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen ) ; 성공: 받은 바이트 수, 실패: SOCKET_ERROR
데이터 전송 함수 (4) recvfrom() 함수 사용 예 // 통신 상대의 주소를 저장하기 위한 변수를 선언한다. SOCKADDR_IN peeraddr; int addrlen; // 수신용 버퍼를 선언한다. char buf[BUFSIZE]; // recvfrom() 함수로 데이터를 받는다. addrlen = sizeof(peeraddr); retval = recvfrom(sock, buf, BUFSIZE, 0, (SOCKADDR *)&peeraddr, &addrlen); if(retval == SOCKET_ERROR) 오류 처리; printf("%d바이트를 받았습니다.\n", retval);
UDP서버-클라이언트(IPv6) IPv4 코드 ⇒ IPv6 코드 ws2tcpip.h 헤더 파일을 포함 소켓 생성 시 AF_INET 대신 AF_INET6를 사용 소켓 주소 구조체로SOCKADDR_IN 대신SOCKADDR_IN6를 사용 구조체를 변경하면 구조체 필드명도 그에 따라 변경 서버에서 주로 사용하는 INADDR_ANY(0으로 정의됨) 값은 in6addr_any(0으로 정의됨)로 변경 IPv4만을 지원하는 주소 변환 함수를 IPv4/IPv6 지원 함수로 대체 데이터 전송 함수는 기존의 sendto( )/recvfrom( ) 함수를 변경 없이 그대로 사용
브로드캐스팅 (1) 통신에 참여하는 개체 간 상호 작용 유니캐스팅 브로드캐스팅 멀티캐스팅 애니캐스팅
브로드캐스팅 (2) 브로드캐스팅 개념 송신자가 보낸 데이터 하나를 다수의 수신자가 받는 방식 데이터 복사본을 여러 개 만들어 보내는 것이 아니므로 송신자 관점에서 보면 상당히 효율적인 기술임 송신자
브로드캐스팅 (3) 브로드캐스트 데이터를 보내기 위한 절차 ① 브로드캐스팅을 활성화함 BOOL bEnable = TRUE; retval = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&bEnable, sizeof(bEnable)); if(retval == SOCKET_ERROR) err_quit("setsockopt()");
브로드캐스팅 (4) 브로드캐스트 데이터를 보내기 위한 절차(계속) ② 브로드캐스트 주소로 데이터를 보냄 // 소켓 주소 구조체를 초기화한다. SOCKADDR_IN remoteaddr; ZeroMemory(&remoteaddr, sizeof(remoteaddr)); remoteaddr.sin_family = AF_INET; remoteaddr.sin_addr.s_addr = inet_addr("255.255.255.255"); remoteaddr.sin_port = htons(9000); // 송신용 버퍼를 선언하고 데이터를 넣는다. char buf[BUFSIZE]; ... // sendto() 함수로 데이터를 보낸다. retval = sendto(sock, buf, strlen(buf), 0, (SOCKADDR *)&remoteaddr, sizeof(remoteaddr)); if(retval == SOCKET_ERROR) 오류 처리; printf("%d바이트를 보냈습니다.\n", retval);
브로드캐스팅 (5) 브로드캐스트 주소의 종류 호스트 ID 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 네트워크 ID 11 . . . . . . . . . . . . 1 네트워크 브로드캐스트 지역 브로드캐스트 11 . . . 1 서브넷 브로드캐스트 서브넷 ID
브로드캐스팅 (6) 브로드캐스트 주소의 종류(계속) 네트워크 브로드캐스트 서브넷 브로드캐스트 지역 브로드캐스트
Thank you www.hanb.co.kr TCP/IP 윈도우 소켓 프로그래밍