Professional Documents
Culture Documents
2013
Tema 5
Sa se realizeze o aplicatie client-server care sa emuleze un server de NTP (Network Time Protocol) folosind protocolul UDP. Clientul va accesa serverul si va cere ora in formatul "Luna zi ora:minut:secunda" (exemplu: May 14 10:20:12) sau in format time_t (numarul secunde care au trecut de la 01.01.1970 00:00:00) prin specificarea unui parametru clientului (-s|-u).
Client:
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdlib.h> int main (int argc, char *argv[]) { if(argc<3){ printf("Usage: ./client <IP adress> <Port no>\n"); exit(-1); }
int sd, n, lung,x,exit=0; struct sockaddr_in server; char nume[50]; char op[50]; char rez[500]; char address[500]; lung = sizeof(server);
server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(argv[1]); // adresa IP a serverului server.sin_port = htons(atoi(argv[2])); bind(sd, (struct sockaddr*)&server, sizeof(server));
while (exit!=1){
printf("Alegeti tipul de informatie:\n 1. Ping \n 2. Whois \n 3. Traceroute \n 4. EXIT! \n Optiune: "); scanf("%d",&x); //alegem tipul comenzii
switch (x){ case 1: sendto (sd, &x, sizeof(x), 0, (struct sockaddr *)&server, sizeof(server)); //trimitem la server comanda. printf("Adresa la care doriti sa faceti ping:"); scanf("%s", address); fflush(stdin); sendto(sd, address, sizeof(address), 0, (struct sockaddr *)&server, sizeof(server)); //trimitem la server adresa de rulare a comenzii. do{ n=recvfrom(sd, rez, 500, 0, (struct sockaddr *)&server, &lung); rez[n] = 0; printf("Recv: %s\n", rez);
}while(strcmp(rez,"exit")!=0); //cat timp nu primim exit de la server citit ce primim de la server. break; case 2: sendto (sd, &x, sizeof(x), 0, (struct sockaddr *)&server, sizeof(server)); printf("Adresa la care doriti sa faceti whois:"); scanf("%s", address); fflush(stdin); sendto(sd, address, sizeof(address), 0, (struct sockaddr *)&server, sizeof(server)); do{ n=recvfrom(sd, rez, 500, 0, (struct sockaddr *)&server, &lung); rez[n] = 0; printf("Recv: %s\n", rez); }while(strcmp(rez,"exit")!=0); break; case 3: sendto (sd, &x, sizeof(x), 0, (struct sockaddr *)&server, sizeof(server)); printf("Adresa la care doriti sa faceti traceroute:"); scanf("%s", address); fflush(stdin); sendto(sd, address, sizeof(address), 0, (struct sockaddr *)&server, sizeof(server)); do{ n=recvfrom(sd, rez, 500, 0, (struct sockaddr *)&server, &lung); rez[n] = 0;
Server:
#include <stdio.h> #include <fcntl.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdlib.h> #include <unistd.h>
int main (int argc, char *argv[]) { if(argc<3){ //daca nu avem destul argument la pornirea server-ului nu putem porni serverul. printf("Usage: ./server <IP adress> <Port no>\n"); exit(-1); } int sd, n, lenAddrClient,x,exit=0; struct sockaddr_in server, client; char nume[50]; char rez[500]; char address[500]; char* command = NULL; lenAddrClient=sizeof(client);
memset ((char *) &server, 0, sizeof (server)); server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; // este in realitate zero! server.sin_port = htons(atoi(argv[2])); bind(sd, (struct sockaddr*)&server,sizeof(server)); //se binduie la adresa si la port-ul furnizat. FILE *fp; //fisierul in care vom citi comenzile while(1){ recvfrom (sd, &x, sizeof(x), 0, (struct sockaddr *)&client, &lenAddrClient); //asteptam sa primim o comanda de la client. switch(x){ case 1: //am primit ping
printf ("Requested Ping\n"); recvfrom(sd, &address, sizeof(address), 0, (struct sockaddr *)&client, &lenAddrClient); //primim adresa comenzii de la client.
asprintf(&command, "ping %s -w 30", address); //creeam comanda fp=popen(command,"r"); while(fgets(rez,500,fp)!=NULL){ comanda trimitem la client prin sendto //o rulam //cat timp avem de citit din
pclose(fp); strcpy(rez,"exit"); sendto (sd, rez, strlen(rez), 0, (struct sockaddr *)&client, sizeof(client)); break; case 2:
printf ("Requested Whois\n"); recvfrom(sd, &address, sizeof(address), 0, (struct sockaddr *)&client, &lenAddrClient); asprintf(&command, "whois %s", address); fp=popen(command,"r"); while(fgets(rez,500,fp)!=NULL){ sendto (sd, rez, strlen(rez), 0, (struct sockaddr *)&client, sizeof(client)); } pclose(fp); strcpy(rez,"exit"); sendto (sd, rez, strlen(rez), 0, (struct sockaddr *)&client, sizeof(client)); break;
case 3:
printf ("Requested Traceroute"); recvfrom(sd, &address, sizeof(address), 0, (struct sockaddr *)&client, &lenAddrClient);
asprintf(&command, "traceroute %s", address); fp=popen(command,"r"); while(fgets(rez,500,fp)!=NULL){ sendto (sd, rez, strlen(rez), 0, (struct sockaddr *)&client, sizeof(client)); } pclose(fp); strcpy(rez,"exit"); sendto (sd, rez, strlen(rez), 0, (struct sockaddr *)&client, sizeof(client)); break;
default: printf("ERROR"); break;} //printf("Recv from %d:%d: %s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),nume); } close(sd); //inchidem socket-ul }