// Experiment 9: TCP client-server chat application
// SERVER side
// Compile: gcc 09_tcp_chat_server.c -o chatserver
// Run    : ./chatserver
// Type messages in either window. Type "exit" to quit.

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

#define PORT 8888
#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);
    }
    if (listen(server_fd, 1) < 0) { perror("listen"); exit(1); }
    printf("Chat server listening on port %d...\n", PORT);

    client_fd = accept(server_fd, (struct sockaddr*)&addr, &addrlen);
    if (client_fd < 0) { perror("accept"); exit(1); }
    printf("Client connected. Start chatting (type 'exit' to quit)\n");

    while (1) {
        // 1. Receive from client
        memset(buffer, 0, BUF);
        int n = read(client_fd, buffer, BUF);
        if (n <= 0) { printf("Client disconnected.\n"); break; }
        printf("Client: %s", buffer);
        if (strncmp(buffer, "exit", 4) == 0) break;

        // 2. Send to client
        printf("You   : ");
        memset(buffer, 0, BUF);
        if (fgets(buffer, BUF, stdin) == NULL) break;
        send(client_fd, buffer, strlen(buffer), 0);
        if (strncmp(buffer, "exit", 4) == 0) break;
    }

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