// Experiment 11: TCP client-server program to transfer a file from client to server
// SERVER side - receives the file
// Compile: gcc 11_tcp_file_server.c -o fileserver
// Run    : ./fileserver
// Output file: received_file.txt

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

#define PORT 7777
#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("File 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. Receiving file...\n");

    FILE *fp = fopen("received_file.txt", "wb");
    if (!fp) { perror("fopen"); exit(1); }

    int n;
    while ((n = read(client_fd, buffer, BUF)) > 0) {
        fwrite(buffer, 1, n, fp);
    }

    fclose(fp);
    printf("File received and saved as 'received_file.txt'.\n");

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