// Experiment 19: TCP client sends a string to the server; server returns its LENGTH
// SERVER side
// Compile: gcc 19_tcp_string_length_server.c -o lenserver
// Run    : ./lenserver

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

#define PORT 2020
#define BUF  1024

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("String-length 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);
    // strip newline if present
    buffer[strcspn(buffer, "\n")] = '\0';

    int len = strlen(buffer);
    printf("Received string: \"%s\"\n", buffer);
    printf("Length         : %d\n", len);

    char reply[64];
    snprintf(reply, sizeof(reply), "Length = %d", len);
    send(client_fd, reply, strlen(reply), 0);

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