본문 바로가기
[ ★ ]Study/Network

UDP 서버 예제 프로그램

by nroses-taek 2017. 6. 12.

UDP 서버 예제 프로그램 -  UDP server example

전체 소스 코드

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
#define PORT 9999
 
int main(void){
    int sock;
    struct sockaddr_in addr, client_addr;
    char recv_buffer[1024];
    int recv_len;
    int addr_len;
 
    if((sock = socket(AF_INET, SOCK_DGRAM, 0)) <0){
        perror("socket ");
        return 1;
    }
 
    memset(&addr, 0x00, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(PORT);
 
    if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){
        perror("bind ");
        return 1;
    }
 
    printf("waiting for messages\n");
 
    addr_len = sizeof(client_addr);
    if((recv_len = recvfrom(sock, recv_buffer, 1024, 0, (struct sockaddr *)&client_addr, &addr_len)) < 0){
        perror("recvfrom ");
        return 1;
    }
    
    recv_buffer[recv_len] = '\0';
 
    printf("ip : %s\n", inet_ntoa(client_addr.sin_addr));
    printf("received data ; %s\n", recv_buffer);
 
    sendto(sock, recv_buffer, strlen(recv_buffer), 0, (struct sockaddr *)&client_addr, sizeof(client_addr));
    
    close(sock);
 
    return 0;
 
}

 

UDP 서버 프로그램은 TCP 서버 프로그램과 달리 소켓에 주소를 할당하여 대기 큐의 크기를 지정한 뒤에 클라이언트의 접속을 기다리는 함수를 사용하지 않고 바로 데이터를 수신하는 함수를 사용하여 클라이언트에서 전송하는 데이터를 수신한다.

UDP 서버 프로그램의 순서도

1. 소켓을 초기화 (socket)

2. 소켓에 IP 주소 및 포트 번호 부여 (bind)

3. 클라이언트의 데이터를 수신(recvfrom)

4. 클라이언트에게 수신된 데이터를 전송(sendto)

5. 소켓 연결 종료(close)

 

RESULT

└ UDP server 프로그램과 client 프로그램을 실행한 결과

udp client 프로그램을 실행한 결과. 잘 작동하네요.

 

UDP 서버 프로그램은 TCP 프로그램과 비교했을 때 대기 큐의 크기를 지정하는 listen() 함수와 클라이언트의 연결을 받아들이는 accept() 함수 없이 바로 recvfrom()함수를 사용하여 클라이언트의 메시지를 수신한다. TCP 서버 프로그램은 accept() 함수를 통해서 클라이언트의 접속을 받아들이면서 클라이언트의 접속 정보를 구조체 변수 sockaddr_in에 저장한다. 하지만, UDP프로그램은 접속이라는 개념 없이 바로 데이터를 송수신하기 때문에 recvfrom() 함수를 통해서 바로 데이터를 수신하면서 클라이언트의 접속 정보 또한 함께 구조체 변수 sockaddr_in에 저장하고 수신된 데이터는 배열 recv_buffer에 저장한다. 클라이언트로 수신받은 데이터는 sendto() 함수를 이용하여 다시 한 번 클라이언트로 전송한다. recvfrom() 함수를 이용하여 데이터를 수신할 때 구조체 변수 client_addr에 클라이언트의 주소 정보가 저장되어 있기 때문에 구조체 변수 client_addr를 이용하여 클라이언트로 데이터를 전송할 수 있다.

'[ ★ ]Study > Network' 카테고리의 다른 글

RAW 소켓  (0) 2017.06.12
UDP 클라이언트 프로그램  (1) 2017.06.12
UDP 프로토콜  (0) 2017.06.12
윈도우 소켓 에러처리 (FormatMessage)  (0) 2017.06.11
TCP 에코 클라이언트 (윈도우)  (0) 2017.06.11

댓글