#include <stdio>
#include <string>
#include <stdlib>
#include <arpa>

#if SYSTEM == UNIX
    #include <sys>
    #include <netinet>
#else
    #include <winsock>
    #define close closesocket
#endif

#define PORT 3666

void
addr_init (struct sockaddr_in *addr, int port, long ip)
{
    addr->sin_family = AF_INET;
    addr->sin_port = htons((u_short)port);
    addr->sin_addr.s_addr = ip;
}

int
main (int argc, char *argv[])  {
    int i, size, N, sd, n1, n2, n3, n4;
    struct sockaddr_in client_addr, server_addr;

    #ifdef WIN
        WSADATA wsaData;
        iResult = WSAStartup (MAKEWORD (2,2), &wsaData);
        
        if (iResult !=0){
            printf ("ERROR: WSA could not be initialized!\n");
            return 0;
        }
    #endif

    if (argc<3)  {
        printf ("Usage: %s <SERVER ADDRESS> <MESSAGE>\n", argv[0]);
        exit (1);
    }

    N=argc-2;
    
    if (sscanf (argv[1], "%d.%d.%d.%d", &n1,&n2,&n3,&n4) != 4) {
        printf ("ERROR: %s is not a valid IP address\n", argv[1]);
        exit (2);
    }
    
    addr_init (&server_addr, PORT, inet_addr(argv[1]));
    
    if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == -1) {
        exit (2);
    }
    
    if (connect (sd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)) == -1) {
        exit (3);
    }
    
    send (sd, (int*)&N, sizeof(int), 0);
    
    for (i=0; i<N; i++) {
        size = strlen (argv[i+2]);
    
        send (sd, (int*)&size, sizeof(int), 0);
        send (sd, (char*)argv[i+2], size, 0);
    }
    
    close (sd);
}
