• Aucun résultat trouvé

1.1R´esolutiondenoms TPn 4(suite)RoutageetProtocoleSNTP1Indicationspourled´ebutduTP Universit´eParisDiderot–Paris7Programmationr´eseauL3InformatiqueAnne2010-2011,2 semestre

N/A
N/A
Protected

Academic year: 2022

Partager "1.1R´esolutiondenoms TPn 4(suite)RoutageetProtocoleSNTP1Indicationspourled´ebutduTP Universit´eParisDiderot–Paris7Programmationr´eseauL3InformatiqueAnne2010-2011,2 semestre"

Copied!
3
0
0

Texte intégral

(1)

Universit´ e Paris Diderot – Paris 7 Programmation r´ eseau L3 Informatique Anne 2010-2011, 2

`eme

semestre

TP n

4 (suite)

Routage et Protocole SNTP

1 Indications pour le d´ ebut du TP

1.1 R´ esolution de noms

Nous d´etaillons ici la fa¸con de d´eterminer les adresses IP correspondant ` a un nom d’hˆ ote. Il y a en C deux API d’acc`es ` a DNS (Domain Name System) qui- peuvent ˆetre utilis´ees pour cela. L’ancienne API, repr´esent´ee par gethostbyname, qui ne supporte pas IPv4, et la nouvelle API repr´esent´ee par getaddrinfo, qui supporte IPv4 et IPv6.

1.1.1 L’API

gethostbyname

L’ensemble des adresses d’un hˆote est repr´esent´ee par une structure de type struct hostent :

struct hostent { char *h_name;

char **h_aliases;

int h_addrtype;

int h_length;

char **h_addr_list;

}

#define h_addr h_addr_list[0]

Les champs h_addr_list contient la liste des adresses de l’hˆote sous forme d’un tableau de pointeurs sur des tableaux de char de longueur 4 chacun ; la fin du tableau est indiqu´e par un pointeur nul. La syntaxe h_addr est un synonyme de h_addr_list_[0] (il s’agit de l’adresse “pr´ef´er´ee” de l’hˆote).

La r´esolution d’un nom se fait en appelant la fonction gethostbyname :

struct hostent *gethostbyname(const char *name);

int h_errno;

En cas de r´eussite, cette fonction retourne un pointeur sur une structure de type struct hostent. En cas d’´echec, elle retourne un pointeur nul, avec h_errno

1

(2)

contenant le code d’erreur. La valeur contenue dans h+errno pouvant ˆetre analys´ee par les fonctions herror et hstrerror.

Comme les autres fonctions de l’interface demandent une adresse sous forme de struct in_addr, il faut effectuer une conversion :

host=gethostbyname("lucien");

if(host==NULL){

...

}

memcpy(&adrr.s_addr, host->h_adrr,4);

o` u addr est un pointeur vers un objet de type struct in_addr.

1.1.2 L’API

getaddrinfo

Dans cette nouvelle API, l’ensemble des adresses d’un hˆote est repr´esent´e par une liste chaˆın´ee de structures de type addrinfo :

struct addrinfo{

int ai_flags;

int ai_family;

int ai_socktype;

int ai_protocol;

size_t ai addrlen;

struct sockaddr *ai_addr;

char *ai_canonname;

struct addrinfo *ai_next;

}

Une telle liste chaˆın´ee est construite par la fonction getaddrinfo :

int getaddrinfo(char *node, char *service,

struct addrinfo *hints, struct addrinfo **res);

Le param`etre node est le nom d’hˆ ote ` a r´esoudre ; le param`etre service peut soit valoir NULL, soit ˆetre le nom d’un service, dans ce cas getaddrinfo rem- plira le champ sin_port ou sin6_port du r´esultat. Les champs ai_socktype et ai_protocol ont le mˆeme sens que les deux derniers param`etres de l’appel socket.

Le param`etre hints contient des param`etres suppl´ementaires. Il va normale- ment pointer sur une struct addrinfo initialis´ee ` a 0 si l’application est prˆete ` a accepter aussi bien des adresses IPv4 que IPv6 ; si l’application d´esire uniquement des adresses IPv4, le champs hints->ai_family doit ˆetre initialis´ee ` a AF_INET.

2

(3)

1.2 Pour le broadcast

Pour pouvoir faire un broadcast avec des sockets, vous devrez utilisez la fonc- tion setsockopt et pour attendre sur une socket un certain d´elai vous pouvez utiliser la fonction select.

2 Suite du TP

Exercice 1

[Un d´emon] Modifiez le client programm´e pour qu’il envoie des requˆetes ind´efiniment ` a intervalles presque r´eguliers de 30 secondes environ, et qu’il main- tienne une estimation de l’´ecart entre l’horloge locale et l’horloge distante.

De nombreuses extensions sont possibles. On peut par exemple converser si- multan´ement avec plusieurs serveurs et maintenir des statistiques s´epar´ees pour chaque serveur connu, ´eliminer les ´echantillons qui ont subi un d´elai trop impor- tant, comparer les heures donn´ees par plusieurs serveurs, ajouter une interface graphique qui affiche en temps r´eel les d´elais vis-` a-vis des diff´erents serveurs, etc.

3

Références

Documents relatifs

Lancez la commande nc avec l’option -l 8080, cela ouvre un serveur sur votre machine locale sur le port 8080.. Tapez une ligne dans

Les hints prennent aussi le forme d’une structure addrinfo : vous pouvez indiquer des restrictions sur le type de socket que vous souhaitez utiliser (si vous n’avez aucune

Pour cela vous pouvez utiliser la commande telnet (usage : telnet machine service o` u service peut ˆetre soit le num´ero de service soit le nom du service)1. D´eterminez le

Dans ce protocole, les informations binaires sont en g´en´eral cod´ees en paquets, et envoy´ees sur le r´eseau, l’octet de poids le plus fort en premier, c’est-` a-dire selon le

Ecrivez un programme Java ´ jdaytime qui se connecte au service daytime d’une machine donn´ ee en param` etre et r´ ecup` ere la date pour l’afficher ` a l’´ ecran.. Exercice

L’id´ee est la suivante : un client producteur envoie au serveur une chaˆıne de caract`eres qu’il aura re¸cu par l’entr´ee standard (le clavier), le serveur stocke alors

Lorsqu’il d´etermine que c’est n´ecessaire, le client SNTP envoie au serveur une requˆete sous forme d’un paquet UDP qui contient la date ` a laquelle ce message est transmis..

int bind(int socket, const struct sockaddr *adresse, socklen_t longueur);. int listen(int socket,