/* simpleudpserver.c */

#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<netinet/in.h>

#define SERVER_PORT	1500 	/* Ein Port der auch von 'gew�hnlichen' Benutzern verwendet werden darf */
#define MSG_SIZE	128		/* Die maximale Anzahl an Zeichen, die 'msg' enhalten darf */


int main(int argc, char **argv){
	int fromsocket; /* Socket, der auf ankommende Anfragen wartet */
	struct sockaddr_in fromaddr, cliaddr;
	char msg[MSG_SIZE]; /* der Buffer f�r die Nachrichten */
	char help[MSG_SIZE]; /* Hilfsvariable */
	int bytes; /* hier wird die Anzahl der gelesenen Bytes gespeichert */
	int cli_size;

	printf("%s: server is up and running ...\n", argv[0]);

	/* Socket erzeugen; mit UDP */
	fromsocket = socket(PF_INET,SOCK_DGRAM,0);
	if(fromsocket == -1){
		fprintf(stderr, "%s: cannot open socket\n", argv[0]);
		exit(1);
	}

	/* Adresse zum Empfangen definieren */
	fromaddr.sin_family = PF_INET;
	fromaddr.sin_addr.s_addr =  INADDR_ANY; /* eine Anfrage kann von jeder IPAdresse kommen */
	fromaddr.sin_port = SERVER_PORT; /* Port den der Server belegt */

	/* Socket an Port binden */
	if(bind(fromsocket, (struct sockaddr *)&fromaddr, sizeof(fromaddr)) == -1){
		fprintf(stderr, "%s: cannot bind socket\n", argv[0]);
		exit(1);
	}

	/* Auf Anfragen warten */
	for(;;){ /* Endlosschleife; "forever" */
		/* Nachricht vom Client lesen und Adresse des Client in cliaddr speichern */
		cli_size = sizeof(cliaddr);
		if((bytes = recvfrom(fromsocket, msg, sizeof(msg), 0, (struct sockaddr *)&cliaddr, &cli_size)) == -1){
			fprintf(stderr, "%s: error while receiving reply\n", argv[0]);
			exit(1);
		}
		/* es handelt sich um einen String, also darf man das abschlie�ende '\0'
		nicht vergessen */
		msg[bytes] = '\0';

		printf("%s: received request from '%s'\n", argv[0], msg);

		/* vor die empfangene Nachricht "Hallo " stellen */
		strcpy(help, "Hallo ");
		strcat(help, msg);
		strcpy(msg, help);

		/* Antwort an Client senden */
		if(sendto(fromsocket, msg, strlen(msg), 0, (struct sockaddr *)&cliaddr, cli_size) == -1){
			fprintf(stderr, "%s: error while replying\n", argv[0]);
			exit(1);
		}
	}

	exit(0);
	return 0;
}