#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <string.h>

int main(int argc, char **argv)
{
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;
    struct sockaddr_in client;

    printf("Initialising Winsock2...\n");
    if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d\n", WSAGetLastError());
        return 1;
    }
    printf("Initialised.\n");

    if((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d\n", WSAGetLastError());
        return 1;
    }
    printf("Socket created.\n");

    server.sin_addr.s_addr = inet_addr("192.168.0.13");
    server.sin_family = AF_INET;
    server.sin_port = htons(1234);

    // Binding
    if(bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d\n", WSAGetLastError());
        return 1;
    }else
    {
        printf("Binded\n");
    }

    printf("Listening incomming connections..\n");
    listen(s, 1);

    // Accept connections
    int c = sizeof(struct sockaddr_in);
    SOCKET s2 = accept(s, (struct sockaddr *)&client, &c);
    if(s2 != SOCKET_ERROR || INVALID_SOCKET)
    {
        printf("Connection accepted with %s on port %d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
    }else
    {
        printf("Connection failed with %s on port %d reason : %s\n",inet_ntoa(client.sin_addr), ntohs(client.sin_port), WSAGetLastError());
    }

    while(1)
    {
        char commandIn[999];
        char commandOut[999];
        char replyOut[20] = "Received !";

        if(recv(s2, commandIn, 998, MSG_PEEK) != SOCKET_ERROR)
        {
            printf("Command from client: %s\n", commandIn);
            if(send(s2, replyOut, 19, 0) != SOCKET_ERROR)
            {
                printf("Reply sent !\n");
                return 0;
            }
        }
    }



    closesocket(s2);
    closesocket(s);
    WSACleanup();

    return 0;
}