// Experiment 17: TCP forking (multi-client) program
// CLIENT side - run multiple of these against one forkserver
// Compile: gcc 17_tcp_fork_client.c -o forkclient
// Run    : ./forkclient   (type messages, '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 3030
#define BUF  1024

int main() {
    int sock;
    struct sockaddr_in serv_addr;
    char buffer[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 forking server. Type 'exit' to quit.\n");

    while (1) {
        printf("You: ");
        memset(buffer, 0, BUF);
        if (fgets(buffer, BUF, stdin) == NULL) break;
        send(sock, buffer, strlen(buffer), 0);
        if (strncmp(buffer, "exit", 4) == 0) break;

        memset(buffer, 0, BUF);
        int n = read(sock, buffer, BUF);
        if (n <= 0) break;
        printf("Srv: %s", buffer);
    }

    close(sock);
    return 0;
}
