/* test_socket.cc - Programme de test des sockets. */ /* Simulotron - Programme de simulation de robot {{{ * * Copyright (C) 2005 Nicolas Haller * * Robot APB Team/Efrei 2005. * Web: http://assos.efrei.fr/robot/ * Email: robot AT efrei DOT fr * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * }}} */ #include "socket_server.hh" #include "socket_client.hh" #include "utils/errno_exception.hh" #include #include #include //Chaine et char de test const std::string strDepart = "J'aime la prog système."; std::string strDest; const char a = 'f'; char b; int testSockServ(SocketServer & sockServ); int testSockClient(int pauseMode); int main(void) { pid_t pid; int resultServer = 0, resultClient; // Pause mode pour débugger le fork int pauseMode = 0; // Création de la socket serveur; SocketServer sockServ("",4242); // Mise en écoute du socket serveur sockServ.listen(12); // on fork pour traiter le client et le serveur pid = fork(); if(pid == 0) //Processus fils testSockClient(pauseMode); else //Processus parent resultServer = testSockServ(sockServ); // On analyse les résultats wait(&resultClient); if (!(WIFEXITED(resultClient) && WEXITSTATUS(resultClient) == 0)) { std::cerr << "ECHEC: Problème coté client" << std::endl; exit (-1); } if (resultServer != 0) { std::cerr << "ECHEC: Problème coté serveur" << std::endl; exit (-1); } return 0; } int testSockServ(SocketServer & sockServ) { try { // Acceptation d'une connection SocketClient sockFork(sockServ); // Reception d'un message sockFork.read(strDest, true); 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 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 1; //} // Ecriture du serveur vers le client //sockFork.putChar(a); } catch(errno_exception & chier) { std::cout << "CHIER !! Une exception a été lancé coté serveur!!" << std::endl; std::cout << chier.what() << std::endl; return 1; } return 0; } int testSockClient(int pauseMode) { // Chance pour debbuger le fork while(pauseMode) sleep(10); try { // Création de la socket client SocketClient sockClient; // Demande de connection sockClient.connect(std::string("127.0.0.1"), 4242); // Ecriture du client dans le serveur sockClient.write(strDepart); // Reception du message serveur sockClient.read(strDest, true); 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; exit (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; // exit (1); //} } catch(errno_exception & chier) { std::cout << "CHIER !! Une exception a été lancé coté client!!" << std::endl; std::cout << chier.what() << std::endl; exit (1); } exit (0); }