Bonjour à tous !!!
C'est mon premier post sur developpez.com, alors soyez indulgent si jamais je fais une entorse au règlement ou à vos habitudes (pas taper, pas taper)
Alors voilà ma situation: je suis étudiant et j'effectue en ce moment mon stage de fin de DUT (bac+2). Je dois programmer un manager SNMP en C++ avec Qt (je n'ai pas posté dans la section Qt car je ne pense pas que ce logiciel soit à l'origine de mon problème).
J'ai décidé d'utiliser la library winSNMP (avec winsnmp.h et WSNMP32.Lib), en m'aidant de MSDN:
http://msdn.microsoft.com/en-us/library/aa379373(v=VS.85).aspx
Je voulais commencer par un programme permettant d'envoyer une requête snmp-get et de réceptionner la réponse.
J'ai donc suivi le protocole pas à pas (ouverture application, ouverture session, ... etc), et j'ai obtenu un programme qui envoyait correctement le message, mais ne recevait rien (la fonction SnmpRecvMsg me retournait "SNMPAPI_NOOP" ce qui signifie "The specified session has no messages in its queue at this time").
Pour corriger ce problème j'ai ajouté une temporisation entre l'émission et la réception:
Compilation et exécution, tout va pour le mieux dans le meilleur des mondes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 time_t debut = time(NULL); int fin = 1; while ((time(NULL)-debut) < fin);.
Je rajoute donc les fonctions qui permettent de récuperer les informations contenues dans la réponse (SnmpGetPduData et SnmpGetVb), je compile et puis patatra: segfault.
j'essaye donc un débogage, et là Qt m'indique que l'erreur vient de ma tempo O_o
Je suis donc coincé:
-soit je laisse la tempo, je receptionne la réponse mais le programme plante,
-soit je retire la tempo, le programme ne plante pas mais je ne reçois rien,
Cependant l'erreur ne peut pas provenir de la temporisation (puisque le programme a fonctionné avec), elle vient forcement des fonctions ajoutées.
De plus l'erreur persiste même en remplacant la tempo par des fonctions type sleep ou delay.
Voici donc la partie du programme qui nous intéresse:
Pour une meilleure lisibilité, j'ai retiré les if-else quasi-identiques au premier.
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 //-------------------------( attendre )------------------------------ time_t debut = time(NULL); int fin = 1; while ((time(NULL)-debut) < fin); //le debogage signale l'erreur ici //-------------------------( recevoir un message )------------------- recv = SnmpRecvMsg(hSession,RepsrcEntity,RepdstEntity,Repcontext,&RepPDU); if(recv == SNMPAPI_SUCCESS) { recvtxt.setNum(recv); ui->lineEdit_11->setText(recvtxt); } else { error = SnmpGetLastError(hSession); errortxt.setNum(error); ui->lineEdit_11->setText(errortxt); } //-------------------------( recuperer donnees )--------------------- data = SnmpGetPduData(RepPDU,dataPDU_type,datarequest_id,dataerror_status,dataerror_index,&datavarbindlist); if(data == SNMPAPI_SUCCESS) { } else { } repvbl = SnmpGetVb(datavarbindlist,index,name,&val); if(repvbl == SNMPAPI_SUCCESS) { } else { } int res = NULL; QString restxt = NULL; res = val.value.uNumber; restxt.setNum(res); ui->lineEdit_16->setText(restxt);
Vous pourrez trouver les définitions des fonctions, des paramètres et des valeurs retournées ici:
http://msdn.microsoft.com/en-us/library/aa379364(v=VS.85).aspx
J'imagine que mon erreur se situe au niveau des pointeurs (source importante de segfault),
donc voilà la déclaration des variables qui nous intéressent:
j'ai également essayé avec "LPHSNMP_PDU RepPDU;" qui correspond à un pointeur de HSNMP_PDU
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 HSNMP_PDU RepPDU = NULL; HSNMP_VBL datavarbindlist = NULL;
puis en passant *RepPDU en paramètre, mais cela provoque aussi un segfault.
Au secours, je sais pas comment me sortir de cette situation.
Ce post est un peu long, mais je voulais exposer clairement mon problème, et vous montrer que j'avais réfléchi avant de poster.
Merci d'avance pour votre aide et vos réponses.
Partager