You are on page 1of 10

Universitatea Politehnica din Timioara

2013

Proiect Retele Calculatoare

Anul III, semestrul al 2-lea Ochiu Mihai, gr. 3.1

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);

sd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); //creeam socket-ul

memset ((char *) &server, 0, 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;

printf("Recv: %s\n", rez); }while(strcmp(rez,"exit")!=0); break; case 4: exit=1; break;

default: printf("Error: Bad imput!"); break; }}

close(sd); // inchidem socket-ul.

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);

sd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); //se creeaza socketul.

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

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 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 }

You might also like