Socket에 대하여 (3) - UDP

code++·2023년 10월 17일

UDP

1. UDP socket Descriptor

#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>

#include <iostream>

using namespace std;

int main(){
    int s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    cout<<"SOCKET ID:"<<s<<endl;

    close(s); //socket 닫음


    s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); //socket 생성
    cout<<"SOCKET ID:"<<s<<endl;

    close(s);// socket 닫음

    
    return 0;
    }
  • UDP Socket Descriptor는 소켓 구분할 목적으로 이후 소켓함수를 쓸 때 같이 전달한다.
  • Socket Descriptor값은 재사용 된다. -> 같은 소켓이 아니라 값이 같아도 완전히 다른값을 의마함
  • 따라서, socket()으로 얻어낸것은 1회만 close() 해야함.

(Linux, mac) - socket descriptor는 filed descriptor와 섞여서 쓰인다.

2. UDP Socket으로 데이터 보내고, 받기

  • 데이터 보내기 sendto() 함수사용, 반환값 = 보낸 바이트 수
int numBytes = sendto(s,buf.c_str(),buf.length(),0,(struct sockaddr*)&sin,sizeof(sin));
    cout << "Sent: "<< numBytes <<endl;
  • 데이터 받기 recvfrom() 함수 사용, 반환값 = 읽은 바이트 수
    numBytes = recvfrom(s,buf2,sizeof(buf2),0,(struct sockaddr*)&sin,&sin_size);

3. UDP Socket이 쓰는 Port

  • UDP client가 사용하는 Socket port를 알고 싶을때는 bind() 함수를 사용한다.
  • getsockname() 함수로 port 번호를 알아내고, bind() 함수로 포트번호를 묶는다.
  • UDP는 데이터 전송시 일부만 전송 되지 않는다.(전부 다 전송함)
  • UDP는 데이터를 일부만 수신 하는 경우는 없다.(전부다 받거나, 유실되거나)
  • UDP는 수신 여부를 알수 없다.
profile
일상

0개의 댓글