From ab21fd007709cc4103bbdbe6dc9360b71475a01b Mon Sep 17 00:00:00 2001 From: haller Date: Tue, 29 Nov 2005 18:49:38 +0000 Subject: * Debut de test pour les socket (test_socket) * Debugage de socket... * socket reste en test --- i/simulotron/src/socket/Makefile.incl.am | 1 + i/simulotron/src/socket/socket.cc | 27 +++-- i/simulotron/src/socket/socket.hh | 2 + i/simulotron/src/socket/test_socket.cc | 166 ++++++++++++++++++++----------- 4 files changed, 132 insertions(+), 64 deletions(-) (limited to 'i') diff --git a/i/simulotron/src/socket/Makefile.incl.am b/i/simulotron/src/socket/Makefile.incl.am index 7b16a9f..a554b58 100644 --- a/i/simulotron/src/socket/Makefile.incl.am +++ b/i/simulotron/src/socket/Makefile.incl.am @@ -3,3 +3,4 @@ socket_S = socket/socket.cc socket/socket.hh $(address_S) $(errno_exception_S) check_PROGRAMS += test_socket test_socket_SOURCES = socket/test_socket.cc $(socket_S) +test_socket_LDFLAGS = -pthread diff --git a/i/simulotron/src/socket/socket.cc b/i/simulotron/src/socket/socket.cc index 8b0ef99..b696690 100644 --- a/i/simulotron/src/socket/socket.cc +++ b/i/simulotron/src/socket/socket.cc @@ -1,5 +1,6 @@ #include #include +#include #include "socket/socket.hh" #include "utils/errno_exception.hh" #include "socket/address.hh" @@ -23,12 +24,13 @@ Socket::Socket(int socket) Socket::~Socket(void) { - close(socket_); + // XXX Pas faisable car les copy détruise les socket + //close(socket_); } void Socket::connect(const Address & address) { - if (::connect (socket_, address.getSockaddr(), sizeof(*address.getSockaddr()) < 0)) + if (::connect (socket_, address.getSockaddr(), sizeof(sockaddr_in)) < 0) throw errno_exception("Impossible de mettre la chaussette", errno); } @@ -41,27 +43,33 @@ void Socket::listen(int maxQueue) Socket Socket::accept(Address & address) { sockaddr addr; - socklen_t length; - + socklen_t length = sizeof(sockaddr_in); + int socket = ::accept(socket_, &addr, &length); if (socket < 0) throw errno_exception("Chaussette bloqué à la douane", errno); address = Address(&addr, length); - + return Socket(socket); } +void Socket::close(void) +{ + ::close(socket_); +} + std::string Socket::read(void) { std::string str; int charReaded; char buffer[BUFFER_SIZE]; - do { charReaded = ::read(socket_, buffer, BUFFER_SIZE - 1); - buffer[charReaded + 1] = 0; + if(charReaded < 0) + throw errno_exception("Socket: problème de lecture", errno); + buffer[charReaded] = 0; str += buffer; }while(charReaded == BUFFER_SIZE - 1); return str; @@ -71,6 +79,7 @@ void Socket::write(const std::string & str) { char buffer[BUFFER_SIZE]; unsigned int pos = 0; + int retval = 0; while(str.size() != pos) { @@ -78,7 +87,9 @@ void Socket::write(const std::string & str) str.copy(buffer, size, pos); pos += size; buffer[size] = 0; - ::write(socket_, buffer, size); + retval = ::write(socket_, buffer, size); + if(retval < 0) + throw errno_exception("Socket: erreur d'écriture (write()) ", errno); } } diff --git a/i/simulotron/src/socket/socket.hh b/i/simulotron/src/socket/socket.hh index a1d6d65..3d054fa 100644 --- a/i/simulotron/src/socket/socket.hh +++ b/i/simulotron/src/socket/socket.hh @@ -22,6 +22,8 @@ class Socket void listen(int maxQueue); /// accepte une connection Socket accept(Address & address); + /// coupe la chaussette + void Socket::close(void); /// lit du socket std::string read(void); /// écrit dans le socket diff --git a/i/simulotron/src/socket/test_socket.cc b/i/simulotron/src/socket/test_socket.cc index 67ff638..4a44e6e 100644 --- a/i/simulotron/src/socket/test_socket.cc +++ b/i/simulotron/src/socket/test_socket.cc @@ -1,74 +1,128 @@ #include "socket/socket.hh" #include "socket/address.hh" +#include "utils/errno_exception.hh" #include -int main(void) -{ - Address adr; - Address adr2; - // Création de deux socket; - Socket sockServ(Address(4242)); - Socket sockClient(adr); - - // Mise en écoute du socket serveur - sockServ.listen(12); +// Adress useful +Address adr; +Address adr2; +//Chaine et char de test +const std::string strDepart = "J'aime la prog système."; +std::string strDest; +const char a = 'f'; +char b; +//threads +pthread_t threadId[2]; +void * retour; +int stateTh[2]; - // Demande de connection - sockClient.connect(Address(std::string("localhost"), 4242)); - Socket sockFork = sockServ.accept(adr2); - //TODO if(adr != adr2) - //{ -// std::cout << "L'adresse du client et l'adresse retourné par le accept sont différentes !!!" << std:endl; -// return 1; - // } +void * testSockServ(void * CaSertARien); +void * testSockClient(void * CaSertARien); - // Ecriture du client dans le serveur - std::string strDepart = "J'aime la prog système."; - std::string strDest; - - sockClient.write(strDepart); - strDest = sockFork.read(); - - if(strDepart != strDest) +int main(void) +{ + int ret; + ret = pthread_create(& threadId[0], NULL, testSockServ, NULL); + if(ret != 0) { - std::cout << "CHIER!! Le message d'origine est altéré en ecrivant du client au serveur!!" << std::endl; - return 1; + std::cout << "CHIER: Echec thread serveur" << std::endl; + return EXIT_FAILURE; } - - // Ecriture du serveur au client - sockFork.write(strDepart); - strDest = sockClient.read(); - - if(strDepart != strDest) + ret = pthread_create(& threadId[1], NULL, testSockClient, NULL); + if(ret != 0) { - std::cout << "CHIER!! Le message d'origine est altéré en ecrivant du serveur au client!!" << std::endl; - return 1; + std::cout << "CHIER: Echec thread client" << std::endl; + return EXIT_FAILURE; } + pthread_join(threadId[0], &retour); + stateTh[0] = (int) retour; + pthread_join(threadId[1], &retour); + stateTh[1] = (int) retour; + if(stateTh[0] == 0 && stateTh[1] == 0) + return 0; + else + return 1; +} - // Ecriture d'un char du client au serveur - char a = 'f'; - char b; - - sockClient.putChar(a); - b = sockFork.getChar(); - - if(a != b) +void * testSockServ(void * CaSertARien) +{ + try { - std::cout << "CHIER!! Le char d'origine est altéré en ecrivant du client au serveur!!" << std::endl; - return 1; + // Création de la socket serveur; + Socket sockServ(Address(4242)); + // Mise en écoute du socket serveur + sockServ.listen(12); + // Acceptation d'une connection + Socket sockFork = sockServ.accept(adr2); + // Reception d'un message + strDest = sockFork.read(); + if(strDepart != strDest) + { + std::cout << "CHIER!! Le message d'origine est altéré en ecrivant du client au serveur!!" << std::endl; + std::cout << "Le message d'origine: " << strDepart << std::endl; + std::cout << "Message reçu: " << std::endl; + return (void *) 1; + } + // Ecriture du serveur au client + sockFork.write(strDepart); + // Reception d'un char + b = sockFork.getChar(); + if(a != b) + { + std::cout << "CHIER!! Le char d'origine est altéré en ecrivant du client au serveur!!" << std::endl; + std::cout << "Le char d'origine: " << a << std::endl; + std::cout << "Le char d'arrivé: " << b << std::endl; + return (void *) 1; + } + // Ecriture du serveur vers le client + sockFork.putChar(a); } - - // Ecriture du serveur vers le client - sockFork.putChar(a); - b = sockClient.getChar(); - - if(a != b) + catch(errno_exception & chier) { - std::cout << "CHIER!! Le char d'origine est altéré en ecrivant du serveur au client!!" << std::endl; - return 1; + std::cout << "CHIER !! Une exception a été lancé coté serveur!!" << std::endl; + std::cout << chier.what() << std::endl; + return (void *) 1; } - + return (void *) 0; +} - return 0; +void * testSockClient(void * CaSertARien) +{ + try + { + // Création de la socket client + Socket sockClient(adr); + // Demande de connection + sockClient.connect(Address(std::string("localhost"), 4242)); + // Ecriture du client dans le serveur + sockClient.write(strDepart); + // Reception du message serveur + strDest = sockClient.read(); + if(strDepart != strDest) + { + std::cout << "CHIER!! Le message d'origine est altéré en ecrivant du serveur au client!!" << std::endl; + std::cout << "Le message d'origine: " << strDepart << std::endl; + std::cout << "Message reçu: " << std::endl; + return (void *) 1; + } + // Ecriture d'un char du client au serveur + sockClient.putChar(a); + // Reception d'un char + b = sockClient.getChar(); + if(a != b) + { + std::cout << "CHIER!! Le char d'origine est altéré en ecrivant du serveur au client!!" << std::endl; + std::cout << "Le char d'origine: " << a << std::endl; + std::cout << "Le char d'arrivé: " << b << std::endl; + return (void *) 1; + } + } + catch(errno_exception & chier) + { + std::cout << "CHIER !! Une exception a été lancé coté client!!" << std::endl; + std::cout << chier.what() << std::endl; + return (void *) 1; + } + return (void *) 0; } -- cgit v1.2.3