#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>        // for close()
#include <arpa/inet.h>     // for inet_addr()
#include <netinet/in.h>    // for sockaddr_in
#include <sys/types.h>
#include <sys/socket.h>

/*
    Send TCP packets using C 

	Author: Tim Pierson, Dartmouth CS60, Fall 2026
            Assisted by Microsoft Copilot
	
	run: gcc send_tcp.c -o send
            ./send
	
	Run receive_tcp.c in another terminal (or computer but update IP address)
	
*/

#define HOST "127.0.0.1"
#define PORT 9090
#define BUFSIZE 1024

int main(void) {
    int client_fd;
    struct sockaddr_in server_addr;
    char buffer[BUFSIZE];

    // 1. Create TCP socket
    client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (client_fd == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    // 2. Define server address
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = inet_addr(HOST);

    // 3. Connect to server
    if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("connect");
        close(client_fd);
        exit(EXIT_FAILURE);
    }

    // 4. Send message
    const char *message = "Hello, Server!";
    if (send(client_fd, message, strlen(message), 0) == -1) {
        perror("send");
        close(client_fd);
        exit(EXIT_FAILURE);
    }

    // 5. Receive response
    ssize_t n = recv(client_fd, buffer, BUFSIZE - 1, 0);
    if (n == -1) {
        perror("recv");
        close(client_fd);
        exit(EXIT_FAILURE);
    }
    buffer[n] = '\0'; // null terminate string

    printf("Received from server: %s\n", buffer);

    // 6. Close socket
    close(client_fd);
    return 0;
}
