Sunteți pe pagina 1din 6

Proiect PI Anul universitar 2011-2012 Dreptate Loredana, grupa 2231, Rata Alberta Diana, grupa 2231.

Comanda implementata : 12# URL Destinatie : ipv6ready.org Echipa 2 : implementare ping6 ipv6ready.org c 5 Programul server in cod C :
#include<stdio.h> //contine declaratii folosite pentru intrari si iesiri si este inclus in toate aplicatiile #include<stdlib.h> //defineste functii numerice de conversie , functii de numere //pseudo-aleatoare , alocare de memorie , functii de control al //procesului #include<string.h> //defineste stringuri pentru functii de manipulare #include<unistd.h> //defineste caracteristicile de implementate identificate de poxis standard //(poxiscompatible job control is supported.) #include<sys/types.h>
//contine definitii pentru tipuri de date folosite in sistemul apelat

#include<netinet/in.h> //contine constant si structure folosite pentru domeniu al adrese i int main() { int rec; int sockfd,newsockfd,portno; //stocheaza valori returnate de socket //un nou socket care creeaza legatura intre socket si server //numarul portului

socklen_t client; char buffer[256]; //in acest buffer serverul citeste mesajele primite de la socket struct sockaddr_in serv_addr,cli_addr; //structura contine o adresa de internet definite in netinet/in.h

int n; sockfd=socket(AF_INET,SOCK_STREAM,0); //af_inet-domeniul adresei socketului //sock_strem-tiipul socket-lui //0-protocol 0 if(sockfd<=0)error(ERROR in opening socket); //daca nu exista socket , avem eroare bzero((char*) &serv_addr,sizeof(serv_addr)); //bzero-seteaza toate valorile din buffer la 0 //(char*)serv_addr-pointer la buffer //sizeof-lungimea bufferului serv_addr.sin_family=AF_INET; //serv_addr are este o structura a tipului struct sockaddr_in . aceasta //structura are 4 argumente.primul e sin_family , care contine cod pentru adresa //familie.trebuie setat tot timpul pe af_inet serv_addr.sin_addr.s_addr=INADDR_ANY; //alt argment al serv_addr este sin_addr , care contine un sg argument //s_addr care contine adresa ip a masinii de pe care ruleaza serverul //inaddr_any-constanta simbolica care preia aceasta adresa serv_addr.sin_port=htons(22312); //alt argument pentru serv_addr este sin_port care contine numarul portului.e nevoie sa convertim numarul in byti folosind functia htons() if(bind(sockfd,(struct sockaddr*) &serv_addr,sizeof(serv_addr))<0) error(ERROR in binding); //bind() apeleaza legatura socket la adresa host si la portul la care //serverul ruleaza.are 3 argumente,descrierea socket,adresa si //lungimea adresei.al 2lea e un pointer la structura sockaddr listen(sockfd,5); //se precizeaza nr max de cereri de conexiune, // fixeaza dimensiune cozii de asteptare //specifies the number of requests that can be queued by the system //before the server executes the accept system call. client=sizeof(cli_addr); // dimensiunea structurei newsockfd=accept(sockfd,(struct sockaddr*) &cli_addr, &client); //the second argument is a reference pointer to the address of the client on the other //end of the connection //accept() primitiva care blocheaza asteptarea pana cand o noua cerere de

conex vine // accept actual connection from the client // descriptor cu aceleasi prop ca si cel original if(newsockfd<0)error( ERROR on accept); // eroare, nu exista cerere de conex //clientul s-a conectat la server bzero(buffer,256); // seteaza toate valorile din buffer la '0' n=read(newockfd,buffer,255); //se foloseste noul socket returnat de accept() if(n<0)error(ERROR reading from socket); if(n<0)error(ERROR writing to socket); // read nu se va executa daca nu are nimic de citit/scris while(1) // permanent loop//bucla infinita { rec = recv(newsockfd,buffer,sizeof(buffer),0); // receptia pachetelor recv() se face cu noul socket // receptie date de la conexiunea realizata anterior // buffer - unde e retinut mesajul // rec- descriptor atribuit primitivei recv() //The third argument is the protocol. If this argument is zero (and it always should be //except for unusual circumstances), the operating system will choose the most // //appropriate protocol. It will choose TCP for stream sockets and UDP for datagram sockets. if(rec==-1) // cazul erorii // indicates only locally-detected errors. { perror(rew); exit(1); } char comanda[4]=12#; // declarare vector comanda implementa char ipv6addr[50]; // declarare vector adresa ipv6 if((strcmp(comanda,buffer))!=0) // compar comanda mea cu cea trimisa => !0 => comanda neinplementata { send(newsockfd,comanda neimplementata,23,0); send(newsockfd,\n,5,0); // raspunsul se trimite catre acelasi client, utilizand noul socket

cu

//apelul send () } else // implementez nslookup { system(nslookup type=AAAA ipv6ready.org>output.out); // nslookup- o retea de administrare care e disponibila pt orice calculator cu un sis de //operare, pentru interogare de domeniu , pt obtinerea adresei IP //system() - invoca executarea comenzii nslookup,odata executata, returneaza //raspunsul in fisierul output.out ( raspuns interpretat de sistem) // -type=AAAA - tipul cautat este a unei Adresei IPv6 pentru site-ul ipv6ready.org FILE *f; //file poiner f=fopen(output.out,r); // deschide fisierul pentru citire char c[100]; // declarea variabila cu care citesc din fisier while(!feof(f)) // cat timp nu am ajuns la finalul fisierului { fscanf(f,%s,c); // fscanf - functie de citire // c - vectorul in care se stocheaza valoarea citita din fisierul f // %s - tipul de date , string-uri // f- fisierul de unde citesc char identific[20]=address; if(strcmp(identific,c)==0) // strcmp - compara string1 cu string2 { Fscanf(f,%s,ipv6addr); // fscanf - functie de citire si stocare // ipv6addr-vectorul in care se stocheaza valoarea din fisierul f // %s - tipul de dat string // f- fisierul din care citesc } } fclose(f); //inchidere fisier if(ipv6addr != NULL) // daca vectorul mi-e diferit de zero { char virgule[5]=,; //declar vector de caractere char ping6[100]=ping6 ; // vector de caractere char linie[128]; //vector citim fisierul char final[5]= c 5;

strcat(ping6,ipv6addr); //functie de concatenare a 2 stringuri strcat(ping6,final); system( ping6);

while(!feof(fping)) //cat timp nu am ajuns la finalul fisierului { fscanf(fping,"%s",linie); // fscanf - functie de citire si stocare // linie-vectorul in care se stocheaza valoarea din fisierul f // %s - tipul de dat string // fping- fisierul din care citesc char identifica[10]="rtt"; if(strcmp(identifica,linie)==0) //am identificat linia si o salvam in linie { fgets(linie,100,fping); strtok(linie,virgule); //functie de segmentare a unui vector de caractere } } fclose(fping); //inched fisierul fping char *mesaj1=URL destinatie = ipv6ready.org; char *spatiu=\n; char *mesaj2=Adresa IPV6 ;
//send()-functia care trimite mesaj catre client //are 4 parametrii-legatura prin care se comunica //mesajul,lungimea mesajului,protocopul

send(newsockfd,mesaj1,strlen(mesaj1),0); send(newsockfd,spatiu,strlen(spatiu),0); send(newsockfd,mesaj2,strlen(mesaj2),0); send(newsockfd,ipv6addr,strlen(ipv6addr),0); send(newsockfd,spatiu,strlen(spatiu),0); send(newsockfd,rtt,strlen(rtt),0); send(newsockfd,spatiu,strlen(spatiu),0); } else {

char *error=error in receiving ipv6 address; send(newsockfd,error,strlen(error),0); } } } close(newsockfd);


//inchidem legatura clinet-server

close(sockfd);
//inchidem socketul return 1;

S-ar putea să vă placă și