How do I create a UDP server?

UDP 소켓을 보낼 수 있도록 해주는 함수 호출의 종류는 다양합니다. 여기에서는 새로운 getaddrinfo를 사용해 소켓 구조체를 준비할 것입니다. UDP는 단순한 패킷이 기본이 되는(data-gram) 프로토콜입니다. 두 호스트 간에 연결은 존재하지 않습니다.

 

우선, hints addrinfo 구조체를 초기화해서 IPv6, passive datagram 소켓을 만듭니다.

memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET6; // use AF_INET instead for IPv4
hints.ai_socktype =  SOCK_DGRAM;
hints.ai_flags =  AI_PASSIVE;

다음으로 getaddrinfo를 사용해 포트 번호를 특정합니다.(서버 소켓을 생성할 때에는 호스트를 특정하지 않고 원격 호스트에 패킷을 보내지 않습니다.)

getaddrinfo(NULL, "300", &hints, &res);

sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
bind(sockfd, res->ai_addr, res->ai_addrlen);

포트 번호가 1024보다 작다면 프로그램은 root 권한을 필요로 합니다. 숫자로된 포트 번호 대신 서비스 이름을 지정할 수도 있습니다.

나머지는 TCP 서버와 유사합니다. 스트림 기반의 서비스는 listen과 accept를 호출해야 합니다. UDP에서는 단지 소켓이 패킷이 도착하기를 기다리면 됩니다.

struct sockaddr_storage addr;
int addrlen = sizeof(addr);

// ssize_t recvfrom(int socket, void* buffer, size_t buflen, int flags, struct sockaddr *addr, socklen_t * address_len);

byte_count = recvfrom(sockfd, buf, sizeof(buf), 0, &addr, &addrlen);

addr 구조체는 도착하는 패킷에 대한 보낸 사람의 정보를 가지고 있습니다. sockaddr_storage 타입이 가능한 모든 종류의 소켓 주소를 저장하기에 충분히 크다는 사실을 기억하세요.(IPv4, IPv6 와 그 외 다른 소켓 타입)

 

Full Code

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
    int s;

    struct addrinfo hints, *res;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET6; // INET for IPv4
    hints.ai_socktype =  SOCK_DGRAM;
    hints.ai_flags =  AI_PASSIVE;

    getaddrinfo(NULL, "300", &hints, &res);

    int sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

    if (bind(sockfd, res->ai_addr, res->ai_addrlen) != 0) {
        perror("bind()");
        exit(1);
    }
    struct sockaddr_storage addr;
    int addrlen = sizeof(addr);

    while(1){
        char buf[1024];
        ssize_t byte_count = recvfrom(sockfd, buf, sizeof(buf), 0, &addr, &addrlen);
        buf[byte_count] = '\0';

        printf("Read %d chars\n", byte_count);
        printf("===\n");
        printf("%s\n", buf);
    }

    return 0;
}
Posted by 몰랑&봉봉
,