// Experiment 6: UDP Client-Server program
// SERVER side
// Compile: gcc 06_udp_server.c -o udpserver
// Run    : ./udpserver

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

#define PORT 9090
#define BUF  1024

int main() {
    int sockfd;
    char buffer[BUF];
    struct sockaddr_in servaddr, cliaddr;

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket"); exit(EXIT_FAILURE);
    }

    memset(&servaddr, 0, sizeof(servaddr));
    memset(&cliaddr,  0, sizeof(cliaddr));

    servaddr.sin_family      = AF_INET;
    servaddr.sin_addr.s_addr = INADDR_ANY;
    servaddr.sin_port        = htons(PORT);

    if (bind(sockfd, (const struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
        perror("bind"); exit(EXIT_FAILURE);
    }

    printf("UDP server up on port %d...\n", PORT);

    socklen_t len = sizeof(cliaddr);
    int n = recvfrom(sockfd, buffer, BUF, 0,
                     (struct sockaddr*)&cliaddr, &len);
    buffer[n] = '\0';
    printf("Client says: %s\n", buffer);

    char *reply = "Hello from UDP server!";
    sendto(sockfd, reply, strlen(reply), 0,
           (const struct sockaddr*)&cliaddr, len);
    printf("Reply sent.\n");

    close(sockfd);
    return 0;
}
