// Experiment 16: UDP client-server program to display the TIME
// SERVER side - sends current date/time to client
// Compile: gcc 16_udp_time_server.c -o timeserver
// Run    : ./timeserver

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

#define PORT 4040
#define BUF  256

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

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

    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(1);
    }
    printf("Time server up on port %d...\n", PORT);

    while (1) {
        socklen_t len = sizeof(cliaddr);
        int n = recvfrom(sockfd, buffer, BUF, 0,
                         (struct sockaddr*)&cliaddr, &len);
        if (n <= 0) continue;
        buffer[n] = '\0';
        printf("Request from client: %s\n", buffer);

        // Build current time string
        time_t now = time(NULL);
        char *tstr = ctime(&now);          // includes trailing newline

        sendto(sockfd, tstr, strlen(tstr), 0,
               (const struct sockaddr*)&cliaddr, len);
        printf("Sent time: %s", tstr);
    }

    close(sockfd);
    return 0;
}
