[Network] 6. UDP 기반 서버/클라이언트

2023. 5. 28. 14:48

 

# 이 글은 윤성우의 열혈 TCP/IP 프로그래밍 책을 기반으로 추가적인 내용을 붙여 작성된 것이다. 원 저자의 책이 매우 좋은 편이니 읽고 관심이 가는 사람들은 책을 구매해보길 바란다. 

 

지난 2차례에 걸쳐 TCP 기반 서버/클라이언트를 살펴보았다. TCP는 Transmission control protocol의 약자로, 데이터의 전송을 보장하는 프로토콜이다.

아래 글에서 조금 더 자세하게 알아볼 수 있다. 

2023.05.23 - [Computer Science/Network Programming] - [Network] 4. TCP기반 서버/클라이언트 1

 

[Network] 4. TCP기반 서버/클라이언트 1

이 글은 윤성우의 열혈 TCP/IP 책을 참고하여 정리하였습니다. 정확한 내용은 도서를 구매해서 참고하시기 바랍니다. TCP/IP 프로토콜 스택 인터넷 기반의 데이터 송수신을 목적으로 설계된 스택 7

mobuk.tistory.com

2023.05.28 - [분류 전체보기] - [Network] 5. TCP 기반 서버/클라이언트 2

 

[Network] 5. TCP 기반 서버/클라이언트 2

이 글은 '윤성우의 열혈 TCP/IP 책'을 기반으로 다양한 정보를 추가해 정리한 내용이다. 저자분이 워낙 유명하시고 설명을 잘하시는 분이니 읽어보고 관심이 있으면 책을 구매해서 학습하길 바란

mobuk.tistory.com

 

 

이번 시간에는 TCP와 함께 가장 많이 쓰이는 것 중 하나인 UDP에 대해 알아볼 것이다. 

 

1. UDP(User Datagram Protocol) 에 대한 이해

UDP 소켓의 특성과 동작원리

UDP 소켓은 SEQ, ACK과 같은 메시지 전달을 하지 않는다. (Flow control 없음)
연결과 해제의 과정이 없어 데이터의 분실 및 손실의 위험이 있다. 
확인의 과정이 없기 때문에 위험도는 있으나 데이터의 전송이 빠르다. 

=> 안전성보다 성능이 중요시 될 때에는 UDP를 사용한다. 

 

 

2. UDP 기반 서버/클라이언트의 구현

UDP 데이터 송수신

TCP는 1대1 연결이 필요하다. 그러나 UDP는 연결의 개념이 존재하지 않아서 서버와 클라이언트 소켓의 구분이 없다. 
연결의 개념이 없으니 하나의 소켓으로 둘 이상의 영역과 데이터 송수신이 가능하다. ( 나중에 나오는 멀티 브로드 캐스팅 등이 이에 해당한다. ) 

 

UDP 기반의 데이터 입출력함수

  • sendto
#include<sys/socket.h>

ssize_t sendto(int sock, void * buff, size_t nbytes, int flags, struct sockaddr * to, socklen_t addrlen);

 

  • recvfrom
#include <sys/socket.h>

ssize_t recvfrom(int sock, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);

 

사용법

if(bind(serv_sock, (sturct sockaddr*)&serv_adr, sizeof(serv_adr))==-1)
	error_handling("bind() error");
while(1)
{
	clnt_adr_sz=sizeof(clnt_adr);
	str_len = recvfrom(serv_sock, message, BUF_SIZE, 0, (struct sockaddr*) &clnt_adr, &clnt_adr_sz);
	sendto(serv_sock, message, str_len, 0, (struct sockaddr*)&clnt_adr, clnt_adr_sz);
}

 

 

UDP의 데이터 송수신 특성과 UDP에서의 connect 함수호출

데이터의 경계가 존재하는 UDP 소켓

if(bind(sock, (sturct sockaddr*) &my_adr, sizeof(my_adr))==-1)
	error_handling("bind() error");
for(i = 0; i< 3; i++ )
{
	sleep(5);
    adr_sz = sizeof(your_adr);
    str_len = recvfrom(sock, message, BUF_SIZE, 0, (sturct sockaddr*)&your_adr, &adr_sz);
    printf("Message %d: %s\n", i+1, message);
}

이렇게 3번 보내면 TCP와는 다르게 3번의 recvfrom 함수호출을 통해서 수신한다. 그리고 전송할 때의 차이점을 보면, TCP와 다르게 connect가 없기 때문에 보낼 때마다 도착지를 기록해두어야한다.

 

connected UDP 소켓

- 1단계 : UDP 소켓에 목적지의 IP 와 PORT 번호 등록
- 2단계 : 데이터 전송
- 3단계 : UDP 소켓에 등록된 목적지 정보 삭제

BELATED ARTICLES

more