IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Programme qui check mes connections, toujours ok


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Par défaut Programme qui check mes connections, toujours ok
    Bonjour !

    Je suis débutant en C++, je suis donc conscient que mon code contient des instructions en C et qu'il n'est pas portable mais ce n'est pas le problème, merci de ne pas me le reprocher !

    Je dois développer un programme pour la société dans laquelle je fais mon alternance qui utilise les sockets (j'ai de l'avance sur le programme de mon BTS, j'ai donc du me débrouiller tout seul, ce qui explique pas mal de galères ) !

    Le fonctionnement est simple :

    Le programme se connecte en telnet (pas le choix, je sais que c'est pas sécurisé) sur un serveur et envoie une requête aux routeurs relié à ce serveur.
    Suite à cette commande, le routeur doit sois renvoyé un message, dans ce cas la connexion est OK et on passe au routeur suivant, soit il ne renvoie rien et dans ce cas cela veut dire que la connexion est DOWN et on crée un rapport d'erreur.

    J'ai testé le programme en local, il fonctionne, en revanche je l'ai essaie sur une plateforme de test réelle avec rien raccordé. En conclusion lorsque je lance mon script, toutes les tentatives de tests se clore par un échec.
    Or au contraire, toutes les connexions sont soi-disantes OK et je ne comprends pas pourquoi...

    Voila mon code (2 fonctions + le main):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    char* conversion(string ligne)
    {
    	/* on créer une variable qui contient la commande à envoyer */
    	char cmd[30] = "sh mpls ldp neighbor ";
     
    	/* on ajoute le routeur a tester */
    	string str_cmd = cmd + ligne;
     
    	/* On reconvertit l'ensemble en char pour qu'il soit exploitable */
    	size_t size = str_cmd.size() + 1;
    	char * cmd2 = new char[100];
    	strncpy( cmd2, str_cmd.c_str(), 100 );
     
    	return cmd2;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    int reponse(SOCKET sock, string ligne)
    {
    	/* On indique qu'on envoie la commande sur le routeur */
    	cout << "Commande envoyee a " << ligne << " : ";
     
    	/* On crée la variable qui contiendra la réponse du routeur */
    	char rep[50] = " ";
     
    	fd_set readfs;
    	FD_ZERO (&readfs);
    	FD_SET(sock, &readfs);
     
    	struct timeval timeout;
    	timeout.tv_sec = 1;
     
    	int err;
    	err = select(sock, &readfs, NULL, NULL, &timeout);
     
    	/* En cas d'erreur ou d'expiration du timeout */
    	if(err == 0)
    	{
    		/* Ouverture du flux pour écrire le rapport */
    		string const str_rapport("rapport.txt");
    		ofstream rapport(str_rapport.c_str(), ios::app);
     
    		if(rapport)
    		{
    			/* On ajoute la ligne. */
    			cout << "DOWN" << endl;
    			rapport << "Le " << ligne << " ne repond pas." << endl;
    		}
     
    		else
    		{
    			cout << "Echec lors de l'ecriture/creation du fichier suivant: \"rapport.txt\"." << endl;
    		}
    	}
     
    	/* Si le routeur renvoie quelques chose */
    	else if(err == -1)
    	{						
    		cout << "Erreur lors de la reception de la reponse..." << endl;
    	}
     
    	else
    	{
    		if(recv(sock, rep, sizeof(rep), MSG_PARTIAL) != SOCKET_ERROR)
    		{
    			cout << "OK" << endl;
    		}
     
    		else
    		{
    			cout << "Erreur lors de la reception de la reponse..." << endl;
    		}
    	}
     
    	return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    #include <iostream>
    #include <winsock2.h>
    #include <fstream>
    #include <string>
     
    #pragma comment(lib, "ws2_32.lib")
     
    typedef int socklen_t;
     
    using namespace std;
     
    int main()
    {
    	bool restart(0);
     
    	do
    	{
    		system("cls");
    		char* ip(0);
    		char* liste_serveurs(0);
     
    		ifstream suppr("rapport.txt");
     
    		if (suppr)
    		{
    			suppr.close();
    			system("del rapport.txt");
    		}
     
    		suppr.close();
     
    		WSADATA WSAData;
    		int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
     
    		SOCKET sock;
    		SOCKADDR_IN sin;
     
    		if (!erreur)
    		{
    			/* Création de la socket */
    			sock = socket(AF_INET, SOCK_STREAM, 0);
     
    			/* Configuration de la connexion */
    			sin.sin_addr.s_addr = inet_addr("adresse_du_serveur");
    			sin.sin_family = AF_INET;
    			sin.sin_port = htons(23);
     
    			/* Pour patienter... */
    			cout << "Connection en cours..." << endl;
     
    			/* Connexion du client */
    			if (connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
    			{
    				/* On indique qu'on est bien connecté */
    				cout << "Connection a " << inet_ntoa(sin.sin_addr) << " sur le port " << htons(sin.sin_port) << " reussi." << endl << endl;
     
    				/* on ouvre la liste des serveurs */
    				ifstream liste_ser(liste_serveurs);
     
    				/* Si l'ouverture du fichier se passe bien */
    				if(liste_ser)
    				{
    					/* on creer la variable qui correspondra au texte de la ligne en cours */
    					string ligne;
     
    					char* buffer = " ";
    					recv(sock, buffer, sizeof(buffer), 0);
     
    					/* Tant qu'on a pas atteint la dernière ligne de la liste */
    					while (getline(liste_ser, ligne))
    					{
    						/* On appelle la fonction conversion */
    						char* cmd2 = conversion(ligne);
     
    						/* On envoie la commande */
    						if (send(sock, cmd2, sizeof(cmd2), 0) != SOCKET_ERROR)
    						{
    							/* On appelle la fonction reponse */
    							reponse(sock, ligne);
    						}
     
    						else
    						{
    							cout << "Erreur lors de l'envoie de la commande..." << endl;
    						}
    					}
    				}
     
    				else
    				{
    					cout << "Echec lors de l'ouverture du fichier suivant: \"liste_serveurs.txt\"" << endl;
    				}
    			}
     
    			else
    			{
    				cout << "Echec lors de la tentative de connection." << endl;
    			}
     
    			/* On ferme la socket précédemment ouverte */
    			closesocket(sock);
     
    			WSACleanup();
    		}
     
    		cout << endl << "Check termine" << endl;
    		cout << "Voulez-vous recommencer ? Oui - 1 / Non - 0" << endl;
    		cin >> restart;
     
    	}while (restart == 1);
     
    	return EXIT_SUCCESS;
    }

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Je ne comprends pas le sens de ta phrase :

    En conclusion lorsque je lance mon script, toutes les tentatives de tests se clore par un échec.
    Or au contraire, toutes les connexions sont soi-disantes OK et je ne comprends pas pourquoi...
    Outre l'usage très malin du verbe "se clorer", dont je dois avouer que je ne sais pas trop bien à quoi il fait référence (mais on va supputer que tu voulais dire "se closent"), comment est-ce que quelque chose qui échoue peut en même temps être soit-disant OK (à moins qu'on soit dans le cas étrange et ô combien connu du Chat de Schrödinger, c'est à dire que ton code te dis OK jusqu'à ce que tu essaie de faire quelque chose avec ta socket, qui, sentant que tu l'observes, te dit finalement que c'est pô bien ce que tu fais).

    Si mon ton moqueur te surprends, rassure toi : je ne mords pas, mais en même temps, comprends que c'est un peu agaçant de devoir essayer de déchiffrer une question qui est écrite dans un français tellement approximatif qu'elle en devient incompréhensible.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 50
    Par défaut
    Bonjour,

    C'est un peu confus effectivement.

    En conclusion lorsque je lance mon script, toutes les tentatives de tests se clore par un échec.
    Les tentatives de quoi? Si ton code fonctionne en local mais que ton programme ne parvient pas à se connecter vers le serveur de tests, revois les règles de par-feu, le port et l'adresse IP de destination. Essayes de tester ton code au pas par pas et ajoutes des messages d'erreurs (WSAGetLastError()).

    Or au contraire, toutes les connexions sont soi-disantes OK et je ne comprends pas pourquoi...
    Idem que précédemment. Dans le doute, utilises un logiciel comme Wireshark.
    Tu verras immédiatement si tu te connectes correctement et si des données sont échangées.

    En espérant que cela ait pu t'aider.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    En conclusion lorsque je lance mon script, toutes les tentatives de tests devraient se clore par un échec.
    Or au contraire, toutes les connexions sont soi-disantes OK et je ne comprends pas pourquoi...
    Citation Envoyé par Emmanuel Deloget Voir le message
    Outre l'usage très malin du verbe "se clorer", dont je dois avouer que je ne sais pas trop bien à quoi il fait référence (mais on va supputer que tu voulais dire "se closent"), [...]

    Si mon ton moqueur te surprends, rassure toi : je ne mords pas, mais en même temps, comprends que c'est un peu agaçant de devoir essayer de déchiffrer une question qui est écrite dans un français tellement approximatif qu'elle en devient incompréhensible.
    Désolé Emmanuel mais son français est tout à fait correct. Le verbe se clore est courant, ThomasMC a juste oublié un mot dans sa phrase et ça nous arrive à tous.

    Citation Envoyé par Emmanuel Deloget Voir le message
    comment est-ce que quelque chose qui échoue peut en même temps être soit-disant OK.
    C'est bien son problème et c'est pour ça qu'il demande de l'aide

Discussions similaires

  1. Réponses: 12
    Dernier message: 21/02/2006, 11h47
  2. programme qui consomme beaucoup de memoire
    Par gaut dans le forum Windows
    Réponses: 10
    Dernier message: 01/02/2005, 20h33
  3. Programme qui analyse un fichier log
    Par abdou.sahraoui dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 20/08/2004, 14h27
  4. [LG]Programme qui n'affiche rien
    Par ousunas dans le forum Langage
    Réponses: 4
    Dernier message: 17/02/2004, 19h38
  5. Recherche programme qui convertit les chiffres arabes en nb
    Par oli57 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 15/06/2002, 03h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo