You are on page 1of 2

#include <errno.

h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>

/* Port na kome se odvija komunikacija. */


#define PORT 9999
/* Velicina bafera. */
#define BUFFER_SIZE 80
static char *program; /* Ime programa. */
/* Funkcija do_work() obavlja komunikaciju sa klijentima. */
static void do_work (int server);
/* Funkcija error_fatal() ispisuje poruku o gresci i potom prekida program. */
static void error_fatal (char *format, ...);
/* Server program za jednu implementaciju daytime servisa. */
int
main (int argc, char **argv)
{
int server; /* Deskriptor socket-a preko koga server
* komunicira sa klijentima. */
struct sockaddr_in address; /* Adresa servera. */
/*
* Inicijalizuje se globalna promenljiva koja predstavlja ime
* programa.
*/
program = argv[0];
/* Kreira se socket za komunikaciju sa klijentima. */
if ((server = socket (PF_INET, SOCK_DGRAM, 0)) < 0)
error_fatal ("%s socket() error: %s\n", argv[0], strerror (errno));
/* Vezuje se socket za datu adresu i port servera. */
bzero (&address, sizeof (struct sockaddr_in));
address.sin_family = AF_INET;
address.sin_port = htons (PORT);
address.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind (server, (struct sockaddr *) &address, sizeof (struct sockaddr_in))
< 0)
error_fatal ("%s bind() error: %s\n", argv[0], strerror (errno));
/* Prihvataju se i obradjuju zahtevi od klijenata. */
do_work (server);
/* Program se zavrsava. */
exit (EXIT_SUCCESS);
}
static void
do_work (int server)
{
char buffer[BUFFER_SIZE]; /* Bafer za razmenu poruka
* sa klijentom. */
time_t now; /* Tekuce vreme. */
int count; /* Duzina poruke. */
struct sockaddr_in address; /* Adresa klijenta. */
socklen_t length; /* Duzina gornje adrese. */
/* U petlji se... */
for (;;)
{
/* ...ucitava poruka od klijenta... */
length = sizeof (address);
if ((count =
recvfrom (server, buffer, BUFFER_SIZE, 0,
(struct sockaddr *) &address, &length)) < 0)
error_fatal ("%s recvfrom() error\n", program);
/* Ocitava se tekuce vreme i formira se poruka za klijenta. */
time (&now);
snprintf (buffer, BUFFER_SIZE, "%s\r\n", ctime (&now));
/* ...i zatim ista poruka vraca klijentu. */
count = strlen (buffer);
if (sendto
(server, buffer, count, 0, (struct sockaddr *) &address,
length) != count)
error_fatal ("%s sendto() error\n", program);
}
}
static void
error_fatal (char *format, ...)
{
va_list arguments; /* Lista argumenata funkcije. */
/* Stampa se string predstavljen argumentima funkcije. */
va_start (arguments, format);
vfprintf (stderr, format, arguments);
va_end (arguments);
/* Prekida se program. */
exit (EXIT_FAILURE);
}

You might also like