ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스 소켓프로그래밍_UDP기반 서버/클라이언트 구현
    CS/Linux 2024. 4. 29. 14:22
    반응형

    TCP는 압축파일 전송 같이 신뢰성이 중요한 경우 사용되지만

    UDP는 실시간 영상 송출 처럼 신뢰도보단 속도가 중요한 경우에 사용된다.

     

    UDP기반 소켓 프로그래밍은 TCP와 다르게 연결 설정의 과정이 없다.

    즉, listen() 함수와 accept함수를 따로 구현할 필요는 없다.

    또한 TCP에서는 소켓과 소켓의 관계가 1대1이다.

    클라이언트가 10개라면 서버의 소켓도 10개가 존재해야했다.

    하지만 UDP는 1개의 소켓으로 여러 클라이언트들을 다룰수 있다는 점에서 차이가 있다.

     

    함수 소개
    TCP에서는 클라이언트에서 주소 정보를 따로 추가하는 과정이 필요하지만 UDP는 비연결지향형이기 때문에 데이터를 전송할때마다

    반드시 목적지의 주소정보를 별도로 추가해야한다.

     

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

    - UDP 데이터 전송시 사용되는 함수

    sock: 데이터 전송에 사용될 UDP 소켓의 파일 디스크립터

    buff: 전송할 데이터를 저장하고 있는 버퍼의 주소값 전달

    nbytes: 전성할 데이터 크기를 전달

    flags: 옵션 지정에 사용되는 매개변수

    to: 목적지 주소정보를 담고있는 sockaddr 구조체 변수의 주소 값 전달

    addrlen: 매개변수 to로 전달된 주소값의 구조체 변수 크기 전달

     

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

     

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

    - UDP 데이터 수신에 사용되는 함수

    sock:데이터 수신에 사용될 UDP 소켓 파일 디스크립터

    buff: 데이터 수신에 사용될 버퍼의 주소값

    nbytes: 수신할 최대 바이트 수 전달

    flags: 옵션 지정에 사용되는 매개변수

    from: 발신지 정보를 채워넣을 sockaddr 구조체 변수의 주소 값 전달

    addrlen: 매개변수 from으로 전달된 주소에 해당하는 구조체 크기 정보를 담고 있는 변수의 주소값

     

    위 두 함수는 UDP 통신의 핵심이라고 해도 과언이 아니다.

     

    UDP 데이터의 경계

    데이터의 경계가 존재하기 때문에 UDP는 recvfrom과 sendto의 횟수가 일치되어야한다.

    즉, 입출력 함수의 호출횟수를 일치시켜야 한다.

     

    connected UDP 소켓

    TCP 통신과 다르게 UDP는 목적지의 주소정보가 등록되어 있지 않다.

    기본적으로 UDP 소켓은 unconnected 소켓이다.

    그렇기에 목적지의 주소정보를 따로 등록해주는 recvfrom,sendto함수를 등록해주는데

    이게 꽤 시간이 많이 걸린다.

    그렇기 때문에 하나의 호스트와 오랜 시간 데이터를 송수신해야한다면 UDP 소켓을 connected 소켓으로 만드는 것이 효율적이다.

     

    connect(sock, (struct sockaddr*)&addr, sizeof(adr) )

    이함수를 통해 TCP와 유사하게 목적지의 주소정보를 등록한다.

    그렇게 되면 recvnfrom, sendto 없이 write와 read로 대체하여 데이터를 주고 받을 수 있다.

     

     

     

     

    반응형
Designed by Tistory.