#include <stdio.h>      /* printf(), fprintf() */
#include <sys/socket.h> /* socket(), bind() */
#include <arpa/inet.h>  /* sockaddr_in, inet_ntoa() */
#include <stdlib.h>     /* atoi() */
#include <string.h>     /* memset() */
#include <unistd.h>     /* close() */
#define ECHOMAX 255     /* Najdluzszy przesylany tekst */
int main(int argc, char *argv[]) {
	int gniazdo;
	struct sockaddr_in echoSerwAdr;
	struct sockaddr_in echoKlientAdr;
	unsigned int klientDl;
	char echoBufor[ECHOMAX];
	unsigned short echoSerwPort;
	int otrzTekstDl;
	if (argc != 2) {
		fprintf(stderr,"Użycie:   %s <UDP SERWER PORT>\n", argv[0]);
		exit(1);
	}
	echoSerwPort = atoi(argv[1]);
	if ((gniazdo = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
	{ perror("socket()"); exit(1); }
	memset(&echoSerwAdr, 0, sizeof(echoSerwAdr));
	echoSerwAdr.sin_family = AF_INET;
	echoSerwAdr.sin_addr.s_addr = htonl(INADDR_ANY);
	echoSerwAdr.sin_port = htons(echoSerwPort);
	if (bind(gniazdo, (struct sockaddr *) &echoSerwAdr, sizeof(echoSerwAdr)) < 0)
	{ perror("bind()"); exit(1); }
	for (;;) {
		klientDl = sizeof(echoKlientAdr);
		/* printf("Przed wykonaniem sleep(10)\n");
		sleep(10);
		printf("po wykonaniu sleep\n"); */
		if ((otrzTekstDl = recvfrom(gniazdo, echoBufor, ECHOMAX, 0,
		                            (struct sockaddr *) &echoKlientAdr, &klientDl)) < 0)
		{ perror("recvfrom()"); exit(1); }
		/* printf("po wykonaniu recvfrom\n"); */
		printf("Przetwarzam klienta %s\n", inet_ntoa(echoKlientAdr.sin_addr));
		if (sendto(gniazdo, echoBufor, otrzTekstDl, 0,
		                (struct sockaddr *) &echoKlientAdr, sizeof(echoKlientAdr)) !=
		                otrzTekstDl)
		{ perror("sendto()"); exit(1); }

	}
}
