// Experiment 12 / 14: TCP client-server program to REVERSE a string
// SERVER side - reverses the received string
// Compile: gcc 12_tcp_reverse_string_server.c -o revserver
// Run    : ./revserver

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

#define PORT 6060
#define BUF  1024

void reverseString(char *str) {
    int n = strlen(str);
    // strip trailing newline if present
    if (n > 0 && str[n-1] == '\n') { str[--n] = '\0'; }
    for (int i = 0, j = n - 1; i < j; i++, j--) {
        char t = str[i];
        str[i] = str[j];
        str[j] = t;
    }
}

int main() {
    int server_fd, client_fd;
    struct sockaddr_in addr;
    socklen_t addrlen = sizeof(addr);
    char buffer[BUF];

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

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

    if (bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
        perror("bind"); exit(1);
    }
    listen(server_fd, 1);
    printf("Reverse-string server on port %d...\n", PORT);

    client_fd = accept(server_fd, (struct sockaddr*)&addr, &addrlen);
    printf("Client connected.\n");

    memset(buffer, 0, BUF);
    read(client_fd, buffer, BUF);
    printf("Received string : %s\n", buffer);

    reverseString(buffer);
    printf("Reversed string : %s\n", buffer);

    send(client_fd, buffer, strlen(buffer), 0);
    printf("Sent reversed string back to client.\n");

    close(client_fd);
    close(server_fd);
    return 0;
}
