/* simpleclient.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 tosocket; /* der Socket, über den die Verbindung zum Server hergestellt wird */
	/* struct sockaddr_in wird in netinet/in.h beschrieben */
	struct sockaddr_in toaddr; /* die Adresse des Servers wird hier gespeichert */
	char msg[MSG_SIZE]; /* der Buffer der für die Nachricht verwendet wird */
	int bytes; /* die Anzahl der gelesenen Bytes wird hier gespeichert */

	/* Kommandozeilenargumente überprüfen */
	if(argc != 3){
		fprintf(stderr, "usage : %s <serveraddr> <clientname> \n", argv[0]);
		exit(1);
	}

	printf("%s: sending data to '%s'\n", argv[0], argv[1]);

	/* zu sendende Nachricht erstellen */
	strcpy(msg, argv[2]);

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

	/* Adresse des Servers definieren */
	toaddr.sin_family = PF_INET;
	toaddr.sin_addr.s_addr =  inet_addr(argv[1]);
	toaddr.sin_port = SERVER_PORT;

	/* Verbindung zum Server herstellen */
	if(connect(tosocket, (struct sockaddr *)&toaddr, sizeof(toaddr)) == -1){
		fprintf(stderr, "%s: cannot connect to server '%s'\n", argv[0], argv[1]);
		exit(1);
	}

	/* Nachricht senden */
	if(send(tosocket, msg, sizeof(msg), 0) == -1){
		fprintf(stderr, "%s: error while sending request to '%s'\n", argv[0], argv[1]);
		exit(1);
	}

	/* Antwort vom Server empfangen */
	if((bytes = recv(tosocket, msg, sizeof(msg), 0)) == -1){
		fprintf(stderr, "%s: error while receiving reply\n", argv[0]);
		exit(1);
	}
	msg[bytes] = '\0'; /* Man kann nicht davon ausgehen, dass der Sender
	den String korrekt abgeschlossen hat, deshalb muss man beim empfangen
	von Strings immer '\0' anhängen */

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

	close(tosocket); /* stattdessen könnte man auch mit exit() aussteigen;
	dabei werden alle Sockets automatisch geschlossen */
	/* exit(0); */
	return 0;
}