/* 
	Servidor de escucha en un puerto.
	Listening server on a port.
	By:
	Por:
		Oscar Medina Duarte
		www.medina-web.com
	Linux> gcc server1.c
	Solaris> cc server1.c -lxnet -lnsl -lsocket
*/
#include <sys/socket.h>
#include <errno.h>
#include <signal.h>
#include <string.h>

#define NUMERODEPUERTO 6666;

extern int apagar=0;

void signalhd(int senal);
void protocolo_control(int);

main() {	
	struct sockaddr_in sin, fsin;
	int s, ssock, alen;
	char *rchs;
	
	
	sin.sin_family = AF_INET;
	sin.sin_addr.s_addr = htonl(INADDR_ANY);
	sin.sin_port = NUMERODEPUERTO;
	
	if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
		perror("Cant create socket");
		exit(1);
	}
	if (bind(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
		perror("Cant assign addres");
		exit(2);
	}
	if (listen(s, 5) < 0) {
		perror("Cant turn to listening mode");
		exit(3);
	}
	signal (SIGCHLD, SIG_IGN);
	signal (SIGINT,signalhd);
	while (1) {
		if (apagar){
			close(s);
			exit(0);
		}
		alen = sizeof(fsin);
		if ((ssock=accept(s, (struct sockaddr *)&fsin, &alen)) < 0) {
			if (errno == EINTR) continue;
			perror("Accept failed");
			exit(4);
		}

	rchs=(char *)inet_ntoa(fsin.sin_addr);	
	printf("\nConexion from : %s\n", rchs);

		switch (fork()) {
			case -1:{
				perror ("Forking error");
				exit (5);
				}
			case 0: {
				close(s);
				protocolo_control(ssock);
				exit(0);
				}
			default: {
				close(ssock);
				break;
				}
		}		
	}
}

void protocolo_control(int Descriptor){
char buf[4096];
int cc;
cc = read (Descriptor, buf, sizeof buf);


		if (cc > 0) {
			printf("Readed data :\n%s\n", buf);
			
			write(Descriptor, buf, strlen(buf));
		}


}

void signalhd(int senal){
	if (senal==SIGINT){
		printf("...Interrupt...\n");
		apagar=1;
	}
}

