#include "rd.h" #include "read_dir.c" main () { char dir[DIRSIZE]; int sd, len_addr; struct sockaddr_in serv_addr, clie_addr; signal (SIGCHLD, SIG_IGN); /* Pentru evitare zombie */ /* Creeaza un socket */ if ((sd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) ERR ("socket", 1); /* Pregateste adresa server */ memset ((char *) &serv_addr, 0, sizeof (serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl (INADDR_ANY); serv_addr.sin_port = htons (PORT_SERVER); /* bind */ if (bind (sd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0) ERR ("bind", 2); /* Bucla principala server */ for (;;) { memset ((char *) &clie_addr, 0, sizeof (clie_addr));/* X */ len_addr = sizeof (clie_addr); /* X */ /* Asteapta o cerere de la un client */ if (recvfrom (sd, dir, DIRSIZE, 0, (struct sockaddr *) &clie_addr, &len_addr) < 0) ERR ("recvfrom", 3); /* Deserveste clientul intr-un proces separat */ if (fork () == 0) { perror ("unu"); perror (dir); read_dir (dir); perror ("doi"); perror (dir); /* Trimite raspunsul la cerere */ if (sendto (sd, dir, strlen (dir), 0, (struct sockaddr *) &clie_addr, len_addr) < 0) ERR ("sendto", 4); exit (0); } } } /* Programul 3.10 Sursa server rdsu.c */