Bonjour à tous!

Je dois faire une application simple d'envoi de trap SNMP en C en utilisant l'api Net-SNMP mais il semblerait que cela ne fonctionne pas.

Je suis sous OpenSuse 13.1 x86_64 et j'utilise la bibliothèque NET-SNMP version 5.7.2. J'ai lancé un démon snmptrap sur ma machine à l'aide de la commande suivante:
Cela permet de voir en direct les traps reçus. La commande suivante fonctionne donc:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
snmptrap -v 2c -c public 127.0.0.1 "" 1.2.3 1.2.3.4 s test
Et me donne le retour:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
52014-02-11 16:00:38 localhost [UDP: [127.0.0.1]:45161->[127.0.0.1]:162]:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (2904325) 8:04:03.25   SNMPv2-MIB::snmpTrapOID.0 = OID: iso.2.3        iso.2.3.4 = STRING: "test"
La bibliothèque semble donc fonctionner correctement.

J'ai fait un premier test avec un SNMP GET, en utilisant l'exemple suivant:
http://cuddletech.com/articles/snmp/node26.html
Cela fonctionne parfaitement.

Maintenant, en ce qui concerne les traps, je me suis inspiré du fichier snmptrap.c que l'on peut trouver ici (un des rares exemple fonctionnel que j'ai pu trouver)
http://sourceforge.net/projects/net-...et-snmp/5.7.2/

Voici donc mon code:

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
 
int main(int argc, char** argv)
{
    struct snmp_session session;
    struct snmp_session* session_handler = NULL;
 
    struct snmp_pdu* pdu = NULL;
 
    oid name[MAX_OID_LEN];
    size_t name_length;
 
    int status;
 
    long sysuptime;
    char csysuptime[20];
    char* uptime;
 
    init_snmp("snmptrap");
 
    snmp_sess_init(&session);
    session.version = SNMP_VERSION_2c;
    session.community = (u_char*)"public";
    session.community_len = strlen((char*)session.community);
    session.peername = "127.0.0.1";
 
    session_handler = snmp_open(&session);
 
    if(session_handler == NULL)
    {
        snmp_sess_perror("snmptrap", &session);
        LOGGER_ERROR("Bad Handler");
    }
 
    pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
 
    if (!pdu)
    {
       snmp_sess_perror("snmptrap", &session);
       LOGGER_ERROR("Failed to create notification PDU!");
    }
 
    sysuptime = get_uptime();
    sprintf(csysuptime, "%ld", sysuptime);
    uptime = csysuptime;
 
    if(snmp_add_var(pdu, objid_sysuptime, sizeof(objid_sysuptime) / sizeof(oid), 't', uptime) != 0)
    {
        snmp_perror(uptime);
        LOGGER_ERROR("Uptime!");
    }
 
    if(snmp_add_var(pdu, objid_snmptrap, sizeof(objid_snmptrap) / sizeof(oid), 'o', "1.2.3") != 0)
    {
        snmp_perror("1.2.3");
        LOGGER_ERROR("Bad OID!");
    }
 
    name_length = MAX_OID_LEN;
 
    if(!snmp_parse_oid("1.2.3.4", name, &name_length))
    {
        snmp_perror("1.2.3.4");
        LOGGER_ERROR("Bad Parsing!");
    }
 
    if(snmp_add_var(pdu, name, name_length, 's', "coucou") != 0)
    {
        snmp_perror("coucou");
        LOGGER_ERROR("Bad Value!");
    }
 
    status = snmp_send(session_handler, pdu) == 0;
 
    if(status)
    {
        snmp_sess_perror("snmptrap", session_handler);
    }
 
    /* snmp_free_pdu(pdu);*/
    snmp_close(session_handler);
    snmp_shutdown("snmptrap");
 
    return EXIT_SUCCESS;
}
Mon problème est que ce programme semble fonctionner mais le démon ne reçoit aucun trap. Qu'ai-je oublié ou mal fait? Pourquoi le snmp_send n'envoie rien?

Merci de votre aide!