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

#ifdef _WIN32
/*  Headerfiles fuer Windows */
#include <winsock.h>
#include <io.h>
#else
/*  Headerfiles fuer Unix/Linux */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define closesocket(s) close(s)
#endif

#define HTTP_PORT 80

void push_value( char *host, char *path, char *value ) {
	time_t tt;
	char datum[15]; // hier wird das Datum eingetragen - 14 Stellen plus ein \0 am Ende -> 15
	char request[300]; // hier kommt der Request hinein
	// Socket erzeugen
	struct sockaddr_in server;
	struct hostent *host_info;
	unsigned long addr;
	int sock;

#ifdef _WIN32
	/* Initialisierung von TCP fuer Windows */
	short wVersReq;
	WSADATA wsaData;
	wVersReq = MAKEWORD( 1, 1 );
	if( WSAStartup( wVersReq, &wsaData ) != 0 ) {
		fprintf( stderr, "Failed to init windows sockets\n" );
		return;
	}
#endif

	/* DATUM erzeugen: */
	tt = time(NULL);
	strftime( datum, sizeof( datum ), "%Y%m%d%H%M%S", localtime(&tt) );
	/* DATUM erzeugt in variable datum */

	sock = socket( PF_INET, SOCK_STREAM, 0 );
	if( sock < 0 ) {
		perror( "failed to create socket" );
		return;
	}

	memset( &server, 0, sizeof( server ) );
	if( ( addr = inet_addr( host ) ) != INADDR_NONE ) {
		/* host ist eine numerische IP-Adresse */
		memcpy( (char *) &server.sin_addr, &addr, sizeof( addr ) );
	} else {
		/* Wandle Servernamen in eine IP-Adresse um */
		host_info = gethostbyname( host );
		if( NULL == host_info ) {
			fprintf( stderr, "unknown server: %s\n", host );
			return;
		}
		memcpy( (char *) &server.sin_addr, host_info->h_addr, host_info->h_length );
	}

	server.sin_family = AF_INET;
	server.sin_port = htons( HTTP_PORT );

	/* Verbindung erzeugen - jetzt wirds ernst */
	if( connect( sock, (struct sockaddr*) &server, sizeof( server ) ) < 0 ) {
		perror( "can't connect to server" );
		return;
	}

	/* Erzeuge und sende den http GET request */
	sprintf( request, "GET %s?value=%s&time=%s HTTP/1.0\nhost: %s\n\n", path, value, datum, host );
	printf( request );
	/* Fire and Forget */
	send( sock, request, sizeof( request ), 0 );

	/* Schliesse den Socket, wir benoetigen ihn nicht mehr */
	closesocket( sock );
}

int main( int argc, char **argv ) {
	if( argc < 3 ) {
		fprintf( stderr, "usage: %s host path value\n", argv[0] );
		return -1;
	}
	push_value( argv[1], argv[2], argv[3] );
	return 0;
}

