7 DS réseau du 11 janvier 2002
La durée de ce contrôle est de deux heures, tous les documents sont
autorisés (y compris ordinateurs).
Le barème probable est de 5 points pour les questions de cours, de
5 points pour les questions sur X11 et de 5 points pour chaque exercice
de codage.
7.1 Questions de cours sur les sockets
Répondez aux questions suivantes (deux lignes de réponse par question
suffisent) :
-
Citez une interface de programmation réseau qui ne soit pas
celle des sockets.
- Par quoi est définie une socket ?
- Donnez la taille en octets d'une adresse générique de socket.
- Existe-t-il des structures adresse de socket de taille inférieure
à celle de la structure adresse générique de socket ? En existe-t-il de
taille supérieure ?
- Sachant que addr est une variable de type
struct sockaddr_in, quel message le compilateur C va afficher en
analysant l'instruction bind(s,&addr,sizeof(addr)); ? Corrigez
l'instruction pour qu'elle se compile sans problème.
- Un descripteur de socket Internet en mode connecté est équivalent
à quelle autre entité système ? Est-ce encore vrai pour une socket Internet
en mode non connecté ?
- Comment peut-on obtenir un pointeur de fichier à partir d'un
descripteur de socket ?
- Quel est le détail important concernant l'initialisation du
troisième argument de la fonction accept ?
- Peut-on utiliser la fonction connect dans un client manipulant
des socketis Internet en mode non connecté ?
- Que symbolise la peluche que le redon a sorti de son sac en début
d'examen ? Un bonus supplémentaire pour ceux qui me donnent son nom.
7.2 Questions sur le protocole X11
Répondez aux questions suivantes :
-
Donnez une ligne de commande pour afficher un serveur Xnest
de la machine choufleur sur le serveur X principal de la machine
courge. Attention, vous devez aussi donner la manipulation a effectuer
pour autoriser cet affichage.
- Donnez les commandes à taper pour afficher un xeyes de la machine
concombre sur le serveur Xnest lancé à la question précédente.
On considère que le serveur Xnest accepte toute connection de client.
- On suppose que votre programme quémandeur de session XDM s'appelle
xdmquery. Son premier paramètre est le nom de machine sur laquelle
tourne le serveur de session et le second paramètre est le nom
complet du serveur X à prendre en charge (nom de la machine et numéro
d'écran). Utilisez ce programme pour que la machine rave prenne
en charge le serveur X principal de la machine concombre (il s'agit
du serveur concombre:0). Sur quelle machine la ligne de commande
doit être tapée ?
- Utilisez xdmquery pour que rave prenne en charge le
serveur Xnest lancé à la première question.
- La ligne de commande de la question précédente provoque l'envoi de
paquets UDP. Quelles sont les machines qui émettent ces paquets UDP ?
Pouvez-vous dire sur quels ports ? Quelles sont les machines qui reçoivent
ces paquets ? Pouvez-vous dire sur quels ports ?
- La ligne de commande des deux questions précédentes donne lieu
à des flux TCP. Expliquez ce que sont ces flux TCP et donnez les
caractéristiques des connexions TCP liées aux flux (c'est à dire
les adresses des sockets aux deux bouts de la connexion).
Attention n'oubliez pas qu'un serveur Xnest est à la fois un serveur
X et un client X.
7.3 Extraits de code du tutorat
7.3.1 Code générique
Écrivez une fonction sendPacket qui permet d'envoyer un paquet
XDMCP et d'attendre pendant quelques secondes une réponse (la fonction
attend la réponse mais ne la lit pas). La fonction prend en paramètres
le descripteur de la socket d'envoi, la structure d'adresse de socket
du serveur XDM et le tampon XDMCP. La fonction ne relance
pas le paquet si aucune réponse n'est reçue mais retourne -1
dans ce cas.
Le prototype de cette fonction est imposé :
int sendPacket(int ds, /* Socket locale */
struct sockaddr_in adresse, /* Socket du serveur */
XdmcpBufferPtr paquet /* Contient le paquet XDMCP */
);
7.3.2 Code spécifique
Écrivez la fonction remplissant une structure XdmcpBuffer avec un
paquet XDMCP de type QUERY. Le prototype de cette fonction est
imposé :
XdmcpBufferPtr buildQuery(void);
Vous utiliserez obligatoirement la fonction XdmcpWriteARRAYofARRAY8.
Écrivez la fonction affichant une structure ARRAY8 sous forme
de chaîne de caractères (fonction pouvant être utilisée pour le
décodage des paquets WILLING par exemple).
Le prototype de cette fonction est imposé :
void displayString(ARRAY8 array);