// Experiment 5: TCP Client-Server - send message from client, displayed on server (and vice versa)
// SERVER side
// Compile: gcc 05_tcp_client_server_msg_server.c -o server
// Run    : ./server

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

#define PORT 8080
#define BUF  1024

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

    // 1. Create socket
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("socket failed"); exit(EXIT_FAILURE);
    }

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

    // 2. Bind
    if (bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
        perror("bind failed"); exit(EXIT_FAILURE);
    }

    // 3. Listen
    if (listen(server_fd, 3) < 0) {
        perror("listen"); exit(EXIT_FAILURE);
    }
    printf("Server listening on port %d...\n", PORT);

    // 4. Accept
    if ((client_fd = accept(server_fd, (struct sockaddr*)&addr, &addrlen)) < 0) {
        perror("accept"); exit(EXIT_FAILURE);
    }
    printf("Client connected.\n");

    // 5. Receive from client
    memset(buffer, 0, BUF);
    read(client_fd, buffer, BUF);
    printf("Message from client: %s\n", buffer);

    // 6. Send reply to client
    char *reply = "Hello from server!";
    send(client_fd, reply, strlen(reply), 0);
    printf("Reply sent to client.\n");

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