네트워크 프로그래밍 CH6. UDP 서버 - 클라이언트

Alpha, Orderly·2023년 3월 27일
0

UDP

  • SEQ / ACK 메시지를 전달하지 않는다.
  • 연결의 설정 / 해제 과정이 없다.
  • 데이터 분실 / 손실 위험이 있다.
  • 확인 과정이 없어 데이터 전송이 빠르다.
  • 성능이 중요하고 안정성이 필요 없을때 사용한다.

UDP 송수신

연결 개념이 존재하지 않아 서버와 클라이언트 소켓의 구분이 없다.
  • 하나의 소켓으로 둘 이상의 영역과 데이터 송수신이 가능하다.

MTU

  • 이더넷을 통해 한번에 최대한으로 보낼수 있는 데이터의 양

UDP 기반 데이터 입출력 함수

전송

#include <sys/socket.h>

ssize_t sendto(int sockfd, void *buff, size nbyte, int flags, struct sockaddr* to, socklen_t addrlen);

성공시 전송된 바이트 수, 실패 시 -1을 반환.

sock - 데이터 전송에 사용 될 UDP 소켓 파일 디스크립터
buff - 전송할 데이터를 저장하고 있는 버퍼의 주소
nbytes - 전송할 데이터 크기를 바이트 단위로 전달
flags - 옵션 지정에 사용되는 매개변수, 지정할 옵션이 없다면 0을 전달한다.
to - 목적지 주소정보를 담는 sockaddr 구조체의 주소
addrlen - 주소 구조체의 크기 
  • 연결의 개념이 없어 데이터 전송시 마다 주소를 지정해야 한다.

  1. bind로 연결
  2. recvfrom 으로 받아와서 sendto로 바로 보내기

listen과 accept과정이 없다

수신

#include <sys/socket.h>

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

성공시 수신한 바이트 수, 실패시 -1 반환

sock - 데이터 수신에 사용 될 UDP 소켓
buff - 데이터 수신에 사용될 버퍼의 주소값 전달.
nbytes - 수신할 최대 바이트 수 전달, buff의 크기보다 클수는 없다.
flags - 옵션 지정에 사용되는 매개변수, 지정할 옵션이 없다면 0을 전달한다.
from - 발신지 정보를 담는 sockaddr 구조체의 주소
addrlen - 주소 구조체의 크기를 받아온다.
  • UDP 소켓은 연결의 개념이 없어 데이터의 전송지가 둘 이상이 될수 있다.
  • 데이터 수신후 어디서 보낸건지 확인이 필요하다.

  1. 만들어진 소켓에 바로 sendto

UDP 특성

  • 데이터의 경계가 존재해 3번 송신시 3번 수신해야 한다.
  • 1회에 전송하는 데이터를 1회에 반드시 전부 수신받는다.
  • 클라이언트 sendto 사용시 자동으로 IP와 PORT 할당,클라이언트는 따로 주소 할당할 필요가 없다.

connected UDP

  1. UDP 소켓에 목적지 IP / PORT 등록
  2. 데이터 전송
  3. UDP 목적지 정보 삭제
  • connected UDP 소켓은 목적지에 대한 정보가 등록이 되며, read / write 함수의 호출이 가능하다.
  • 상대 소켓과 연결이 형성되지는 않는다, 단순 정보 등록에 해당한다.

소켓 생성후 connect 한다

profile
만능 컴덕후 겸 번지 팬

0개의 댓글