Fichier texte: [client-int-int.cc]
// -*- coding: latin-1 -*- #include "libsocket.hh" #include "proto-int-int.hh" #include <cstddef> #include <iostream> #include <cstdlib> using namespace std; //============================================================================== // class Reply // // Un objet Reply permet de représenter toutes les réponses possibles à nos // requêtes. // // Attributs: // status: le status de la réponse // k : si status==OK1, c'est la valeur retournée // si status==OKN, c'est la taille de l'attribut table // sinon n'est pas utilisé // table : si status==OKN, c'est un pointeur vers un tableau de taille k // contenant les valeurs retournées // sinon n'est pas utilisé et vaut NULL //============================================================================== class Reply { public: status_t status; int k; int * table; Reply(); void clear(); }; //------------------------------------------------------------------------------ // constructeur pour initialiser les attributs //------------------------------------------------------------------------------ Reply::Reply() ??? //------------------------------------------------------------------------------ // clear() doit remettre les attributs à "zéro". Il faut en particulier qu'il // libère la table si elle a été créée. Cette méthode est utile lorsqu'on veut // réutiliser le même objet Reply pour obtenir et traiter successivement les // réponses à plusieurs requêtes. //------------------------------------------------------------------------------ void Reply::clear() { ??? } //------------------------------------------------------------------------------ // On veut que (cout << reply << endl) affiche quelque chose de facilement // intelligible. Ceci nous permettra d'afficher les réponses reçues. //------------------------------------------------------------------------------ ostream& operator << (ostream& ostr, Reply& reply) { ??? } //============================================================================== // class ClientIntInt // // Il faut bien comprendre que l'envoi d'une requête et la réception d'une // réponse sont deux opérations. On peut très bien envoyer plusieurs requêtes // d'un coup, puis lire leurs réponses ensuite si on veut. // // L'envoi d'une requête est réalisé par les méthodes send_XXX(...). La // réception d'une réponse est réalisée par la méthode recv(Reply&). //============================================================================== class ClientIntInt : public Client { public: ClientIntInt(); virtual int interaction(); protected: int send_QUIT(); int send_DEL(int i); int send_PUT(int i, int k); int send_GET(int i); int send_PUTN(int n, int* is, int* ks); int send_GETN(int n, int* is); int recv(Reply& reply); }; //------------------------------------------------------------------------------ // constructeur //------------------------------------------------------------------------------ ClientIntInt::ClientIntInt() ??? //------------------------------------------------------------------------------ // recv(Reply& reply) // // Cette méthode réalise la réception d'une réponse. On lui passe un objet // Reply, et elle remplit les champs de cet objet selon la réponse qui est // reçue. //------------------------------------------------------------------------------ int ClientIntInt::recv(Reply& reply) { ??? } //------------------------------------------------------------------------------ // envoie la requête QUIT() //------------------------------------------------------------------------------ int ClientIntInt::send_QUIT() { ??? } //------------------------------------------------------------------------------ // envoie la requête DEL(i) //------------------------------------------------------------------------------ int ClientIntInt::send_DEL(int i) { ??? } //------------------------------------------------------------------------------ // envoie la requête PUT(i,k) //------------------------------------------------------------------------------ int ClientIntInt::send_PUT(int i, int k) { ??? } //------------------------------------------------------------------------------ // envoie la requête GET(i) //------------------------------------------------------------------------------ int ClientIntInt::send_GET(int i) { ??? } //------------------------------------------------------------------------------ // envoie la requête PUTN(n,i1,k1,...,in,kn) // // Pour que la méthode soit plus facile à utiliser dans un programme, on lui // passe, outre "n", un tableau "is" contenant {i1,...,in} et un tableau "ks" // contenant {k1,...,kn} //------------------------------------------------------------------------------ int ClientIntInt::send_PUTN(int n, int* is, int* ks) { ??? } //------------------------------------------------------------------------------ // envoie la requête GETN(n,i1,...,in) // // On passe à cette méthode "n" et un tableau "is" contenant {i1,...,in} //------------------------------------------------------------------------------ int ClientIntInt::send_GETN(int n, int* is) { ??? } //============================================================================== // L'interaction avec le serveur. Pour tester, vous lui ferez faire la // séquence d'opérations suivante: // // PUT(3,77) // PUT(-1,99) // lire et afficher 2 réponses // // GET(3) // GET(-1) // GET(2) // // lire et afficher 3 réponses // // PUTN(3, 0,90, 1,91, 2,92) // PUTN(3, 3,190, 4,191, 5,192) // GETN(4, 0,1,2,3) // lire et afficher 3 réponses // // DEL(3) // DEL(-1) // GET(3) // lire et afficher 3 réponses // // QUIT() // lire et afficher 1 réponse // // vous testerez cela sur un serveur invoqué avec les paramêtres suivants: // // server-int-int 8080 5 // // c'est à dire avec une capacité de 5. //============================================================================== int ClientIntInt::interaction() { ??? } //============================================================================== // client-int-int HOST PORT //============================================================================== int main(int argc, char** argv) { ??? }