#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <netdb.h>

int main(int argc, char **argv) {
	if (argc < 3) {
		printf("Usage: %s [HOSTNAME] [SERVICE]\n", argv[0]);
		exit(0);
	}

	struct hostent *host;
	host = gethostbyname(argv[1]);

	struct servent *servudp, *servtcp;
	servudp = getservbyname(argv[2], "udp");
	servtcp = getservbyname(argv[2], "tcp");

	struct sockaddr_in toudp;
	toudp.sin_family = AF_INET;
	toudp.sin_port = servudp->s_port; // Already in network byte order
	memcpy(&toudp.sin_addr, host->h_addr, host->h_length);

	struct sockaddr_in totcp;
	totcp.sin_family = AF_INET;
	totcp.sin_port = servtcp->s_port; // Already in network byte order
	memcpy(&totcp.sin_addr, host->h_addr, host->h_length);

	int sockudp, socktcp;

	sockudp = socket(AF_INET, SOCK_DGRAM, 0);
	socktcp = socket(AF_INET, SOCK_STREAM, 0);

	printf("Sending with UDP...\n");

	int bufsize = 100;
	void *buf = malloc(bufsize);
	bzero(buf, bufsize);
	sendto(sockudp, "tja", sizeof(char)*3, 0, (struct sockaddr *)&toudp, sizeof(toudp));
	struct sockaddr_in from;
	unsigned int fromsize = sizeof(from);
	bzero(&from, sizeof(from));
	recvfrom(sockudp, buf, bufsize, 0, (struct sockaddr *)&from, &fromsize);
	printf("Got %s as responce\n", buf);

	printf("Sending with TCP...\n");

	bzero(buf, bufsize);

	connect(socktcp, (struct sockaddr *)&totcp, sizeof(totcp));

	send(socktcp, "tja", sizeof(char)*3, 0);
	recv(socktcp, buf, bufsize, 0);
	printf("Get %s as responce\n", buf);

	close(sockudp);
	close(socktcp);
}

