/* derived from  http://www.cs.put.poznan.pl/csobaniec/examples/sockets/server-tcp-simple.c */

#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#undef errno
extern int errno;

static char msg[] =" Hello from server!\n";

int main(int argc, char* argv[])
{
	int sockd, sockd2;
	unsigned int addrlen;
	struct sockaddr_in my_name, peer_name;
	int status;

	/* create a socket */
	sockd = socket(AF_INET, SOCK_STREAM, 0);
	if (sockd == -1)
	{
		perror("Socket creation error");
		exit(1);
	}

	if (argc < 2)
	{
		fprintf(stderr, "Usage: %s port_number\n", argv[0]);
		exit(1);
	}

	/* server address  */
	my_name.sin_family = AF_INET;
	my_name.sin_addr.s_addr = INADDR_ANY;
	my_name.sin_port = htons(atoi(argv[1]));

	status = bind(sockd, (struct sockaddr*)&my_name, sizeof(my_name));
	if (status == -1)
	{
		perror("Binding error");
		exit(1);
	}

	status = listen(sockd, 5);
	if (status == -1)
	{
		perror("Listening error");
		exit(1);
	}

	while(1)
	{
		/* wait for a connection */
		addrlen = sizeof(peer_name);
		sockd2 = accept(sockd, (struct sockaddr*)&peer_name, &addrlen);
		if (sockd2 == -1)
		{
			perror("Wrong connection");
			exit(1);
		}
		write(sockd2, msg, strlen(msg)+1);
		close(sockd2);
	}

	return 0;
}