#include <stdio.h>
#include <string.h>

#if defined(_WIN32)
#include <winsock.h>
#pragma comment(lib, "Ws2_32.lib")

#define SD_SEND 1
#else
#include <sys/socket.h>
#include <arpa/inet.h>
#endif

int main(int argc, char *argv[])
{
    char *server_message = "MESSAGE";
    char client_message[2000] = { 0 };

#if defined(_WIN32)
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != NO_ERROR) { printf("WSAStartup failed: %d\n", iResult); return 1; }
#endif

    int socket_desc = socket(AF_INET, SOCK_STREAM, 0);  
    if (socket_desc < 0) {printf("Could not create socket\n"); return 1;}

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(2000);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    if (bind(socket_desc, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { printf("bind() failed\n"); return 1; }

    if (listen(socket_desc, 1) < 0) { printf("listen() failed\n"); return 1; }
    printf("Listening for incoming connections...\n");

    struct sockaddr_in client_addr;
    int client_size = sizeof(client_addr);
    int client_sock = accept(socket_desc, (struct sockaddr*)&client_addr, &client_size);
    if (client_sock < 0) { printf("accept() failed\n"); return 1; }
    printf("Client connected: %s:%i\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

    if (recv(client_sock, client_message, sizeof(client_message), 0) < 0) { printf("recv() failed\n"); return -1; }
    printf("Client message: %s\n", client_message);

    printf("Sending message...\n");
    if (send(client_sock, server_message, strlen(server_message), 0) < 0) { printf("send() failed\n"); return 1; }

#if defined(_WIN32)
    if (argc > 1 && strcmp(argv[1], "shutdown") == 0)
    {
        printf("Calling shutdown()...\n");
        shutdown(client_sock, SD_SEND);
    }
    if ((argc > 1 && strcmp(argv[argc - 1], "closesocket") == 0))
    {
        printf("Calling closesocket()...\n");
        closesocket(client_sock);
    }
#endif
    printf("Exiting...\n");
    return 0;
}
