// Experiment 13 / 15: TCP client-server program for COMMAND EXECUTION
// CLIENT side
// Compile: gcc 13_tcp_cmd_exec_client.c -o cmdclient
// Run    : ./cmdclient    (type shell commands like 'ls', 'date', 'pwd'; '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 5555
#define BUF  4096

int main() {
    int sock;
    struct sockaddr_in serv_addr;
    char cmd[256], output[BUF];

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

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port   = htons(PORT);
    inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);

    if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
        perror("connect"); exit(1);
    }
    printf("Connected to server. Type shell commands, 'exit' to quit.\n");

    while (1) {
        printf("\ncmd> ");
        if (fgets(cmd, sizeof(cmd), stdin) == NULL) break;
        if (strlen(cmd) <= 1) continue;
        send(sock, cmd, strlen(cmd), 0);
        if (strncmp(cmd, "exit", 4) == 0) break;

        memset(output, 0, BUF);
        int n = read(sock, output, BUF - 1);
        if (n <= 0) break;
        printf("--- Output ---\n%s", output);
    }

    close(sock);
    return 0;
}
