[Network] 6. UDP 기반 서버/클라이언트
# 이 글은 윤성우의 열혈 TCP/IP 프로그래밍 책을 기반으로 추가적인 내용을 붙여 작성된 것이다. 원 저자의 책이 매우 좋은 편이니 읽고 관심이 가는 사람들은 책을 구매해보길 바란다.
지난 2차례에 걸쳐 TCP 기반 서버/클라이언트를 살펴보았다. TCP는 Transmission control protocol의 약자로, 데이터의 전송을 보장하는 프로토콜이다.
아래 글에서 조금 더 자세하게 알아볼 수 있다.
2023.05.23 - [Computer Science/Network Programming] - [Network] 4. TCP기반 서버/클라이언트 1
2023.05.28 - [분류 전체보기] - [Network] 5. TCP 기반 서버/클라이언트 2
이번 시간에는 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 소켓에 등록된 목적지 정보 삭제
'Computer Science > Network' 카테고리의 다른 글
[Network] 8. 도메인 이름과 인터넷 주소 (0) | 2023.05.28 |
---|---|
[Network] 7. 소켓의 우아한 종료 (0) | 2023.05.28 |
[Network] 5. TCP 기반 서버/클라이언트 2 (0) | 2023.05.28 |
[Network] 4. TCP기반 서버/클라이언트 1 (0) | 2023.05.23 |
[Network] 3. 소켓에 할당되는 IP 주소와 PORT 번호 (0) | 2023.05.18 |