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; }
Partager