Department of Computer Science and Engineering UDP Server/Client Department of Computer Science and Engineering Kyung Hee University. Choong Seon Hong
Remind of Connection-Oriented and Connectionless Server Connection-Oriented Service 종점간 연결 설정/해제, 데이터 송수신 등 세 단계의 절차를 거침 주로 TCP를 이용하여 작성 데이터의 안정적인 전달을 보장 (flow control) TCP 프로토콜, telnet, ftp 등 각 클라이언트마다 연결을 개설 클라이언트 수가 증가하면 서버에 부담이 클 수 있음 Connectionless Service 종점간 연결 설정/해제 작업 없이 바로 데이터를 주고 받는 방식 주로 UDP를 이용하여 작성 안정적인 데이터 전달을 보장하지 않으므로 응용 프로그램에서 처리 클라이언트마다 연결을 설정할 필요가 없음 서버의 부담이 적음 (메모리 사용 등) 방송형, 멀티캐스팅형 서비스에 적합
UDP Program UDP (비연결형) 소켓 프로그래밍 절차 TCP와 달리 일 대 일 통신에만 사용되지 않음 비연결형 소켓 일반적으로 연결 설정 과정을 거치지 않음 데이터를 위한 소켓은 하나만 개설 소켓 개설 후 바로 상대방과 데이터를 송수신 Server Client socket() bind() recvfrom() sendto() close() 데이터 송수신 종료
UDP 기반의 데이터 입출력 함수 데이터 전송 함수 주소 정보를 포함해서 데이터를 전송하는 함수 sock: 데이터를 전송할 때 사용할 소켓의 파일 디스크립터 msg: 전송하고자 하는 데이터를 저장해 놓은 버퍼를 가리키는 포인터 len: msg 포인터가 가리키는 위치에서부터 몇 바이트를 전송할 것인지의 크기 flags: 옵션을 설정하는데 필요한 인자. 일반적으로 0. addr: 전송하고자 하는 곳의 주소 정보 addrlen: addr 포인터가 가리키고 있는 구조체 변수의 크기 int sendto(int sock, const void* msg, int len, unsigned flags, const struct sockaddr * addr, int addrlen)
UDP 기반의 데이터 입출력 함수 데이터 수신 함수 데이터가 전송된 위치 정보를 얻을 수 있는 기능 제공 sock: 데이터를 수신할 때 사용할 소켓의 파일 디스크립터 buf: 수신할 데이터를 저장할 버퍼를 가리키는 포인터 len: 수신할 수 있는 최대 바이트 수 flags: 옵션을 설정하는데 필요한 인자. 일반적으로 0. addr: 주소 정보 구조체 변수의 포인터. 함수 호출이 끝나면, 데이터를 전송한 호스트의 주소 정보로 채워짐 addrlen: addr 포인터가 가리키고 있는 구조체 변수의 크기 int recvfrom(int sock, int * buf, int len, unsigned flags, struct sockaddr * addr, int * addrlen)
UDP 에코 서버/클라이언트 프로그램 예제 uecho_server.c, uecho_client.c 실행결과
데이터 경계가 존재하는 UDP 소켓 한쪽이 sendto()를 호출했으면 이 데이터를 받기 위해서 상대방은 반드시 recvfrom()을 호출해야 함 TCP 소켓에서는 스트림을 이용하므로 write()나 send()로 연속하여 쓰기를 수행하거나 read()나 recv()로 연속하여 읽기를 해도 문제가 되지 않음 UDP에서는 sendto() 와 recvfrom() 호출이 서로 짝을 이루도록 순서가 맞아야 함 Server Client 세 번에 걸쳐 메시지 전송 MSG 1 MSG 2 MSG 3 세 번에 메시지 수신 후 세 번에 메시지 전송 MSG 1 MSG 2 세 번에 걸쳐서 메시지 수신 MSG 3
예제 확인 프로그램 예제 becho_server.c becho_client.c 실행결과
TCP 기반에서 connect 함수 호출 시 내부 상황 IP와 Port의 할당. 연결 요청 진행(Three-way handshaking) 커널과 소켓의 연결 생성. TCP 기반 HOST Connect 호출 시 연결 생성 커널(kernel) socket Host
UDP 기반에서 connect 함수 호출 시 내부 상황 IP와 Port의 할당 connect 함수를 호출하지 않는 UDP 클라이언트의 데이터 송 수신 UDP 기반 Host 커널(kernel) socket Host sendto, recvfrom 호출 중 호출 후 sendto, recvfrom 호출 전 호출 중 UDP 기반 Host 커널(kernel) socket Host
Connected UDP connect 함수 호출을 하지 않으면 IP와 Port는 언제 할당 되는가? Connected UDP sendto 함수 호출 시 Connected UDP connect() 함수를 호출해서 IP와 Port를 소켓에 할당해 놓음 sendto()로 데이터를 전송하는 순간 소켓과 커널이 내부적으로 연결 커널은 인자로 받은 소켓주소와 UDP 소켓을 내부적으로 연결해 두고 계속 유지함 TCP와 같이 3-way 핸드쉐이크 연결설정이 이루어지지 않음 UDP 소켓을 통해서 처리속도 향상을 위해 사용 가능 유의사항 잘못된 IP 주소를 인자로 주어도 connect()에서 에러가 발생하지 않음 (3-way 핸드쉐이크가 수행되지 않기 때문) 연결된 UDP의 고정된 통신 상대를 connect()로 변경 가능 데이터를 주고 받는 속도가 빨라진다. TCP 소켓 기반의 데이터 입 출력 함수를 그대로 사용 할 수 있다. read(), write()
성능이 향상된 UDP echo client 프로그램 예제 cecho_ client.c,
실습과제 #3 daytime service와 host정보를 제공해주는 UDP 서버프로그램과 UDP 클라이언트 프로그램을 작성하시오. 코드명: info_server.c, infor_client.c 실행 예 ./info_client 163.180.118.99 3333 Input: time => Today is 2015/10/07. Input: 163.180.96.54 => Host name is nms2.kyunghee.ac.kr.