Powered by AdLogger, Click Fraud Protection.
HOME | WIKI | JOINC RSS | °Ô½ÃÆÇ RSS    lynx ¿¡¼­µµ (±¤°í¸¸ »©°í)¹®Á¦¾øÀÌ º¸ÀÌ´Â »çÀÌÆ® JOINC
WIKI ÆäÀÌÁö
x man page
x ¹Ì´Ï»çÀÌÆ®
x Àüü±â»ç¸ñ·Ï
x ±â»çÁÖÁ¦º°
x Á¶°¢ÄÚµå
x ÆÁ¸ðÀ½
x ´ÚºÏ¿ø¹®µé
x ÄÄÇ»ÅÍ¿ë¾î»çÀü
x FAQ
x JCvs
x ¸µÅ©¸ðÀ½
x ÀÚ·á¹æ

·Î±×ÀÎ
¾ÆÀ̵ð

ÆÐ½º¿öµå

°¡ÀÔÇϱâ

°Ô½ÃÆÇ
x ¹¯°í´äÇϱâ
x ²ôÀûÀ̱â
x ÆÁ¸ðÀ½
x »õ¼Ò½Ä
x ±¤°í/È«º¸
x Á¦¾È¹× Àǰß

Åë°è
MRTG Æ®·¡ÇÈÁ¤º¸
À¥·Î±×ºÐ¼® º¸±â
Á¢±ÙÁ¤º¸ º¸±â
3,054 ÀÏ ¿î¿µÁß

´º½º±×·ì
han.comp.lang.c
han.comp.lang.c++

±âº»¹®¼­
o ÀÌ »çÀÌÆ®¿¡ ´ëÇØ¼­
o Âü¿©Çϱâ
o docbook »ç¿ëÇϱâ
o vim »ç¿ëÇϱâ
o C++ÇÁ·Î±×·¡¹Ö HOWTO
o CÇÁ·Î±×·¡¹Ö FAQ

   ÀλýÀº ´ÙÀ½ µÎ°¡Áö·Î ¼º¸³µÈ´Ù. ÇÏ°í ½ÍÁö¸¸ ÇÒ ¼ö ¾ø´Ù. ÇÒ ¼ö ÀÖÁö¸¸ ÇÏ°í ½ÍÁö ¾Ê´Ù. - ±«Å× -
SNMPÀÀ¿ë ÇÁ·Î±×·¥ Á¦ÀÛ
Posted on 2003/5/20
Topic: ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö
SNMP¸¦ ÀÌ¿ëÇÏ¸é ³×Æ®¿öÅ©¿Í ½Ã½ºÅÛ °ü¸®¸¦ À§ÇÑ À¯¿ëÇÑ Á¤º¸¸¦ ½±°Ô ¾ò¾î¿Ã ¼ö ÀÖ´Ù. À̹ø ±â»ç´Â SNMP¸¦ ÀÌ¿ëÇØ¼­ ³×Æ®¿öÅ© Á¤º¸¸¦ ¾ò¾î¿À´Â ¹æ¹ýÀ» ¿¹Á¦¸¦ ÅëÇØ¼­ Á¦½ÃÇϰíÀÖ´Ù.

SNMP ÇÁ·Î±×·¡¹Ö

SNMP ÇÁ·Î±×·¡¹Ö

À± »ó¹è

dreamyun@yahoo.co.kr

교정 과정
교정 0.82003³â 4¿ù 15ÀÏ 23½Ã
ÃÖÃÊ ¹®¼­ÀÛ¼º


1절. ¼Ò°³

Áö³­¹ø ±â»ç¿¡¼­ °£´ÜÇÏ°Ô SNMPÀÇ °³¿ä¿Í ¼³Ä¡¹× ¿î¿ë¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. À̹ø¿¡´Â ½ÇÁ¦ SNMPÀÀ¿ëÇÁ·Î±×·¥, ´õ Á¤È®È÷ ¸»Çؼ­ SNMP Manager¸¦ ÀÛ¼ºÇÏ´Â ³»¿ëÀ» ´Ù·ç°Ô µÈ´Ù.

ÀÌ °­ÁÂÀÇ ³»¿ëÀº TutorialÇü½ÄÀ» µû¸£°Ô µÉ°ÍÀÌ´Ù. ¾îµð±îÁö³ª SNMP¸¦ ÀÀ¿ëÇØ¼­ ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇϴ°Ϳ¡ ÃÐÁ¡À» ¸ÂÃâ°ÍÀ̸ç, SNMPÇÁ·ÎÅäÄÝ Â÷¿øÀÇ »ó¼¼ÇÑ ³»¿ë¿¡ ´ëÇØ¼­´Â ´Ù·çÁö ¾ÊÀ»°ÍÀÌ´Ù. ¾î¶µç ÀÌ ¹®¼­¸¦ ÅëÇØ¼­ SNMP¾ÖÇø®ÄÉÀÌ¼Ç Á¦ÀÛÀÇ ±âº»ÀûÀÎ ¾ÆÀ̵ð¾î¸¦ ¾òÀ»¼ö ÀÖÀ»°ÍÀÌ´Ù.


2절. SNMP ¾ÖÇø®ÄÉÀÌ¼Ç ÀÛ¼º

2.1절. Áغñ»çÇ×

¸ÕÀú Á¢±ÙÇÒ¼ö ÀÖ´Â SNMP agent°¡ ÁغñµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. ÀÚ½ÅÀÇ È£½ºÆ®¿¡ ¼³Ä¡µÇ¾î ÀÖ´Ù¸é Å×½ºÆ®ÇÏ±â ÆíÇϰÚÁö¸¸ , ÀÚ½ÅÀÇ È£½ºÆ®¿¡ ¼³Ä¡µÇ¾î ÀÖÁö ¾Ê´Ù°í ÇÏ´õ¶óµµ Á¢±ÙÇÒ¼ö ÀÖ´Â snmp agent°¡ ¼³Ä¡µÈ È£½ºÆ®°¡ ÀÖÀ¸¸é °ü°è¾ø´Ù.

ÀÌÃ¥ÀÇ ¸ðµç ³»¿ëÀº ±âº»ÀûÀ¸·Î ucd snmp 4.x¸¦ ±âÁØÀ¸·Î ÀÛ¼ºµÇ¾îÀÖ´Ù. ucd snmpÀÇ ¼³Ä¡¿Í ¿î¿µ¹æ¹ý¿¡ ´ëÇØ¼­´Â SNMP°³¿ä¹× ¼³Ä¡,¿î¿ë±â»ç¸¦ Âü°íÇϱ⠹ٶõ´Ù.

¿©·¯ºÐÀÌ ucd snmp¸¦ ¼º°øÀûÀ¸·Î ¼³Ä¡Çß´Ù¸é, snmp°³¹ß ¶óÀ̺귯¸®¿Í Çì´õÆÄÀϵéÀÌ ¼³Ä¡µÉ °ÍÀÌ´Ù. snmp¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µé±â À§Çؼ­´Â ÀÌµé ¶óÀ̺귯¸®¿Í Çì´õÆÄÀÏÀÇ À§Ä¡¸¦ ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù. ucd snmp¸¦ ÄÄÆÄÀÏÇÒ¶§, --prefix ¿É¼ÇÀ» »ç¿ëÇÏÁö ¾Ê¾Ò´Ù¸é, ±âº»¼³Ä¡µð·ºÅ丮ÀÎ /usr/loca/lib, /usr/local/include/ucd-snmp¿¡ ¼³Ä¡µÉ°ÍÀÌ´Ù. °¢ÀÚ È®ÀÎÇØº¸±â ¹Ù¶õ´Ù.


2.2절. ¿¹Á¦ÇÁ·Î±×·¥À» ÅëÇÑ ÀÌÇØ

¾Õ¼­ ÀÌ ¹®¼­´Â tutorialÇü½ÄÀ» µû¸¥´Ù°í ÇßÀ½À¸·Î, ¿ì¼± °£´ÜÇÑ ¿¹Á¦ÇÁ·Î±×·¥À» ¸¸µé¾îº¸°í, ¿¹Á¦ÇÁ·Î±×·¥À» ¼³¸íÇÏ´Â ½ÄÀ¸·Î snmpÇùֿ¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

¿ì¸®°¡ ¸¸µé°íÀÚ ÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀº ÀÎÀÚ·Î OID¸¦ ÁÖ¸é agent·Î ¿¬°áÇØ¼­ OID¿¡ ´ëÇÑ °ªÀ» °¡Á®¿À´Â ÇÁ·Î±×·¥À¸·Î °¡Àå´Ü¼øÇÏÁö¸¸ snmpÇùÖÀÇ ±âº»ÀûÀÎ °ñ°ÝÀ» °¡Áö°í ÀÖÀ½À¸·Î ÀÌ ¿¹Á¦¸¦ Àß ÀÌÇØÇÏ°Ô µÇ¸é ´Ù¸¥ ÀÀ¿ëµµ °¡´ÉÇÒ°ÍÀÌ´Ù.

¿¹Á¦ : simple_snmp.cc
/* 
 * ÀÌ ¾ÖÇø®ÄÉÀ̼ÇÀº snmp1 snmp2¸¦ ±âÁØÀ¸·Î 
 * ÀÛ¼ºÇÑ´Ù. 
 * ucd-snmp Çì´õÆÄÀϵéÀ» ÀÎŬ·çµå ½ÃŲ´Ù. 
 * ¾Æ±Ô¸ÕÆ®·Î MIDÀ̸§ ȤÀº ´ëÀÀµÇ´Â OIDÀ̸§À» ÀԷ¹޴´Ù. 
 */

#include <ucd-snmp/ucd-snmp-config.h>
#include <ucd-snmp/ucd-snmp-includes.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
    struct snmp_session session, *ss;
    struct snmp_pdu *pdu;
    struct snmp_pdu *response;

    oid anOID[MAX_OID_LEN];
    size_t anOID_len = MAX_OID_LEN;

    struct variable_list *vars;
    int status;


    if (argc < 2)
    {
        printf("Usage : simple_snmp OID\");
        exit(0);
    }
    /*
     */
    init_snmp("snmpapp");

    /*
     * sessionÀ» ÃʱâÈ­ ÇÑ´Ù. ¿ì¸®´Â ¸¸µé¾îÁø ¼¼¼ÇÀ» ÀÌ¿ëÇØ¼­ 
     * ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÏ°Ô µÈ´Ù. 
     * ¼¼¼ÇÀ» ¸¸µé±â À§Çؼ­ SNMP±âº»Á¤º¸ÀÎ, 
     * È£½ºÆ®À̸§, Ä¿¹Â´ÏÄÉÀ̼Ç, ¹öÁ¯Á¤º¸µéÀ» ÀÔ·ÂÇÑ´Ù.  
     */
    snmp_sess_init(&session);
    session.peername = "localhost";
    session.version = SNMP_VERSION_2c;
    session.community = "public";
    session.community_len = strlen(session.community);

    /*
     * À§ÀÇ ÃʱâÈ­ Á¤º¸¸¦ Åä´ë·Î 
     * ¼¼¼ÇÀ» ¿¬´Ù 
     */
    SOCK_STARTUP;
    ss = snmp_open(&session);
    if (!ss)
    {
        snmp_perror("ack");
        exit(0);
    }
    /* ¿äûÀ» À§ÇÑ PDU¸¦ ¸¸µç´Ù. 
     * PDU¿¡ ´ëÇÑ ³»¿ëÀº ÀÌ¹Ì ¾ÕÀüÀÇ ±â»ç¿¡¼­ 
     * ¼³¸íÇßÀ½À¸·Î Âü°íÇϱ⠹ٶõ´Ù.  
     */
    pdu = snmp_pdu_create(SNMP_MSG_GET);
    read_objid(argv[1], anOID, &anOID_len);
    snmp_add_null_var(pdu, anOID, anOID_len);

    /*
     * ¸¸µé¾îÁø ¿äûÀ» º¸³½´Ù. 
     * ÇÔ¼öÀ̸§¿¡¼­ ¾Ë¼ö ÀÖµíÀÌ µ¿±â¿äûÀÌ´Ù. 
     * Áï ÀÀ´äÀÌ ¿Ã¶§±îÁö ±â´Ù¸°´Ù. 
     * ¹°·Ð ºñµ¿±â ¿äûµµ ÀÖ´Ù. 
     * ÇØ´ç ¼¼¼ÇÀ¸·Î pdu¸¦ º¸³»°í response·Î ÀÀ´äÀ» 
     * ¹Þ¾Æ¿Â´Ù. 
     */
    status = snmp_synch_response(ss, pdu, &response);


    /*
     * ¸®ÅϰªÀÌ ³Ñ¾î¿Ô´Ù¸é..  
     * °ªÀ» °Ë»çÇÑ´Ù.  
     */
    if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR)
    {
        int count = 1;
        /*
         *  Àоî¿Â Á¤º¸¸¦ ºÐ¼®Çؼ­ Ãâ·ÂÇÑ´Ù.  
         */
        for (vars = response->variables; vars; vars = vars->next_variable)
        {
            char *sp = (char *)malloc(1 + vars->val_len);
            memcpy(sp, vars->val.string, vars->val_len);
            sp[vars->val_len] = ' ';
            /*
             * µû·Î ¼³¸íÇҰǵ¥, 
             * ÀÀ´äÀº ÀÚ½ÅÀÇ °íÀ¯Å¸ÀÔÀ» °¡Áö°í ÀÖ´Ù. 
             * Áï ÀÏ¹Ý ½ºÆ®¸µÀÎÁö, ¼ýÀÚÀÎÁö, ½Ã°£°ü·ÃµÈ 
             * °ªÀÎÁö¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù. 
             * ±×·³À¸·Î ŸÀÔ¿¡ µû¶ó¼­ 󸮹æ¹ýÀ» ´Þ¸®ÇØ¾ß ÇÑ´Ù. 
             */
            switch(vars->type)
            {
                case ASN_OCTET_STR:
                {
                    printf("value #%d is a string: %s\", count++, sp);
                    break;
                }
                case ASN_GAUGE:
                case ASN_COUNTER:
                case ASN_TIMETICKS:
                case ASN_INTEGER:
                {
                    int a;
                    memcpy((void *)&a, sp, 4);
                    printf("value #%d is a INTEGER: %d\", count++, a);
                    break;
                }
                case ASN_IPADDRESS:
                {
                    int a;
                    struct in_addr st_addr;
    
                    memcpy((void *)&a, sp, 4);
                    st_addr.s_addr = a;
                    printf("value #%d is a IPADDR: %s\", count++, inet_ntoa(st_addr));
                    break;
                }   
            }
            free(sp);
        }
    }
    else
    {
        if (status == STAT_SUCCESS)
        {
            fprintf(stderr, "Err : %s\", snmp_errstring(response->errstat));
        }
        else
        {
            snmp_sess_perror("snmpget", ss);
        }
    }

    if (response)
    {
        snmp_free_pdu(response);
    }
    snmp_close(ss);

}
			
ÄÚµåÀÚü¸¦ ÀÌÇØÇÏ´Â µ¥¿¡´Â º°¾î·Á¿òÀÌ ¾øÀ»°ÍÀÌ´Ù. À§ÀÇ snmpÀÀ¿ë ¾ÖÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇÏ´Â ÀüÇüÀûÀÎ ¸ð½ÀÀ» º¸¿©ÁØ´Ù.

  1. Áï °¡Á¤ ¸ÕÀú snmp agent(ÀÌÇÏ ¿¡ÀÌÀüÆ®)¿Í ¿¬°áÀ» ¸Î±â À§ÇÑ ¼¼¼ÇÃʱâÈ­ ÀÛ¾÷ À¸·Î ¿©±â¿¡´Â È£½ºÆ®À̸§°ú, Ä¿¹Â´ÏƼÀ̸§, ±×¸®°í SNMP¹öÁ¯Á¤º¸°¡ µé¾î°¡°Ô µÈ´Ù. SNMP¹öÁ¯Àº ´ÙÀ½°ú °°ÀÌ ÁغñµÇ¾î ÀÖ´Ù.

    표 1. SNMP ¹öÁ¯ Á¤ÀÇ »ó¼ö

    SNMP_VERSION_1snmp ¹öÁ¯ 1
    SNMP_VERSION_2csnmp ¹öÁ¯ 2
    SNMP_VERSION_2uÁ¤ÀǸ¸µÇ¾î ÀÖ°í »ç¿ëµÇ¾îÁöÁö´Â ¾Ê´Â´Ù.
    SNMP_VERSION_3snmp ¹öÁ¯ 3
    ¼¼¼ÇÀ» ¸Î°íÀÚ ÇÏ´Â ¿¡ÀÌÀüÆ®ÀÇ snmp ¹öÁ¯Áö¿ø¿©ºÎ¿Í ¾î´À ¹öÁ¯¿¡¼­ Áö¿øÇÏ´Â snmpÁ¤º¸¸¦ °¡Áö°í ¿Ã°ÍÀÎÁö¸¦ È®ÀÎÇØ¼­ Àû´çÇÑ ¹öÁ¯À¸·Î ¼±ÅÃÇÏ¸é µÈ´Ù. º¸Åë SNMP_VERSION_1 ȤÀº SNMP_VERSION_2c¸¦ »ç¿ëÇÏ¸é ¹®Á¦¾øÀ¸¸ç, SNMP_VERSION_2c¸¦ »ç¿ëÇÏ´Â°Ô °¡À幫³­ÇÏ´Ù. snmp3¿¡¼­ Æ÷ÇÔÇÏ´Â ´Ù¸¥±â´Éµé(º¸¾È¹®Á¦, ȤÀº È®ÀåµÈ ´Ù¸¥Á¤º¸µé)À» ÀÌ¿ëÇÏÁö ¾Ê´Â´Ù¸é SNMP_VERSION_2c¸¦ »ç¿ëÇϵµ·Ï ÇÏÀÚ.

    snmp_sess_init()ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

  2. À§¿¡¼­ ¸¸µç ¼¼¼ÇÁ¤º¸¸¦ »ç¿ëÇØ¼­ ¼¼¼ÇÀ» ¿¬´Ù(open).

    snmp_open()ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

  3. ¿©·¯ºÐÀÌ ¿¡ÀÌÀüÆ®·Î ºÎÅÍ Á¤º¸¸¦ ¿äûÇϱâ À§Çؼ­´Â PDU¸¦ ÀÛ¼ºÇؾßÇÑ´Ù. PDU¿¡´Â ¿äûÇϰíÀÚ ÇÏ´Â Á¤º¸ÀÇ OID, ¿äûÁ¾·ù(GET, GET NEXT, SETµî)¸¦ ¸í½ÃÇØ¾ß¸¸ ÇÑ´Ù.

    »ç¿ëµÇ´Â ÇÔ¼ö´Â snmp_pdu_create()¿Í read_objid()°¡ ÀÖ´Ù.

  4. PDU¸¦ ÀÛ¼ºÇß´Ù¸é, ÀÌÁ¦ ¿¡ÀÌÀüÆ®Ãø¿¡ SNMP¿äû(ÆÐŶ)À» º¸³»¾ß ÇÒ°ÍÀÌ´Ù. ¿äûÀ» À§Çؼ­ snmp_synch_response()ÇÔ¼ö°¡ Á¦°øµÈ´Ù. À̰ÍÀº µ¿±âÀûÀÎ ¿äûÀ» À§Çؼ­ »ç¿ëÇÑ´Ù. ºñµ¿±âÀûÀ¸·Î ¿äûÇÒ¼öµµ Àִµ¥, À̰ÍÀº µû·Î ¾ð±ÞÇϵµ·Ï ÇϰڴÙ.

  5. ÀÀ´äÀÌ ¿Ô´Ù¸é ÀÀ´äµ¥ÀÌŸ¸¦ ºÐ¼®ÇØ¾ß ÇÒ°ÍÀÌ´Ù. ÀÀ´äµ¥ÀÌŸ´Â snmp_pdu ±¸Á¶Ã¼ÇüÅ·Π³Ñ¾î¿À°Ô µÈ´Ù. ÀÀ´äµ¥ÀÌŸ¸¦ ºÐ¼®ÇÒ¶§ Áß¿äÇÑ °ÍÀº ¹Ù·Î µ¥ÀÌŸÀÇ Å¸ÀÔÁ¤º¸ÀÌ´Ù. snmpÁ¤º¸¸¦ º¸¸é ¾î¶²°ÍÀº ÀÏ¹Ý ¹®ÀÚ¿­ÀÎ ¹Ý¸é ¾î¶²°ÍÀº ¼ýÀÚ, ȤÀº ½Ã°£µîÀÇ Á¤º¸¸¦ °¡Áø´Ù. ÀÌÀÇ ±¸ºÐÀ» À§Çؼ­ snmp_pdu±¸Á¶Ã¼¿¡´Â ÇØ´ç µ¥ÀÌŸÀÇ Å¸ÀÔÁ¤º¸¸¦ °¡Áö´Â º¯¼ö°¡ ÁöÁ¤µÇ¾î ÀÖ´Ù. ÁÖ·Î »ç¿ëµÇ¾îÁö´Â µ¥ÀÌŸŸÀÔ¿¡´Â ´ÙÀ½°ú °°Àº°ÍµéÀÌ ÀÖ´Ù.

    표 2. SNMP µ¥ÀÌŸ ŸÀÔ

    ASN_OCTET_STRÀÏ¹Ý ¹®ÀÚ¿­
    ASN_GAUGEunsigned 32bit int
    ASN_INTEGERsigned 32bit int
    ASN_IPADDRESS32bit ÀÎÅͳÝÁÖ¼Ò
    ASN_COUNTERunsigned 32bit int
    ASN_TIMETICKSunsigned 32bit int
    ASN_OIDOID ¹®ÀÚ¿­

À§ÀÇ SNMPµ¥ÀÌŸ ŸÀÔÇ¥¿¡¼­ ASN_TIMETICKSÀÇ °æ¿ì 1/100ÃÊ ´ÜÀ§ÀÌ´Ù. ¿¹¸¦ µé¾î ½Ã½ºÅÛÀÇ UpŸÀÓÀ» °¡Á®¿À±â À§Çؼ­ simp_snmp¸¦ ½ÇÇà½ÃÄ״µ¥, ´ÙÀ½°ú °°Àº °á°ú°¡ ³ª¿ÔÀ» °æ¿ì
 
[root@localhost test]# ./snmp3 system.sysUpTime.0
value #1 is a INTEGER: 32172
			
321.72Ãʰ¡ µÈ´Ù.

ÀÌÁ¦ À§ÀÇ ¿¹Á¦ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÏ°í º»°ÝÀûÀÎ Å×½ºÆ® ÇØº¸µµ·Ï ÇÏÀÚ. ÄÄÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ÇϸéµÈ´Ù.
[root@localhost test]# gcc -o simple_snmp simple_snmp.c -I/usr/local/include/ucd-snmp -lsnmp -lcrypto
			
´ÙÀ½Àº Å×½ºÆ® °á°úÀÌ´Ù. Áß°£Áß°£¿¡ °á°ú¿¡ ´ëÇÑ ¼³¸íÀ» ´Þ¾Æ³õ¾ÒÀ¸´Ï Âü°íÇϱ⠹ٶõ´Ù.
# ÀÎÅÍÆäÀ̽º ÁÖ¼Ò°¡Á®¿À±â
[root@localhost test]# ./simple_snmp ip.ipAddrTable.ipAddrEntry.ipAdEntAddr.192.168.100.130
value #1 is a IPADDR: 192.168.100.130

# 2¹ø ÀÎÅÍÆäÀ̽º(eth0)¿¡ ´ëÇÑ MTU»çÀÌÁî °¡Á®¿À±â 
# .2 ´ë½Å¿¡ .1À» »ç¿ëÇÒ°æ¿ì 1¹ø ÀÎÅÍÆäÀ̽º(loopback)¿¡ ´ëÇÑ MTU»çÀÌÁ 
# ¾ò¾î¿Ã¼ö ÀÖ´Ù. 
[root@localhost test]# ./simple_snmp interfaces.ifTable.ifEntry.ifMtu.2
value #1 is a INTEGER: 1500

# 2¹ø ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ ¹Ù±ùÀ¸·Î Àü¼ÛµÈ ÆÐŶÀÇ °¹¼ö
[root@localhost test]# ./simple_snmp interfaces.ifTable.ifEntry.ifOutOctets.2
value #1 is a INTEGER: 1192344

# ½Ã½ºÅÛºÎÆÃÈÄ °æ°ú½Ã°£  
[root@localhost test]# ./simple_snmp system.sysUpTime.0                      
value #1 is a INTEGER: 166258

# 2¹ø ÀÎÅÍÆäÀ̽ºÀÇ ¼Óµµ
# 10Mbps ·£ÀÓÀ» ¾Ë¼ö ÀÖ´Ù. 
[root@localhost test]# ./simple_snmp interfaces.ifTable.ifEntry.ifSpeed.2
value #1 is a INTEGER: 10000000
			
Å×½ºÆ®¸¦ À§Çؼ­ ¾î¶² MIB(OID)°¡ ÇÊ¿äÇÑÁö Àß ¸ð¸£°Ú´Ù¸é, ucd-snmp¿¡¼­ Á¦°øÇÏ´Â ¸Þ´ÏÀú ÇÁ·Î±×·¥Áß snmpwalk¸¦ ÀÌ¿ëÇØ¼­ Á¤º¸¸¦ ¿äÃ»ÇØ¼­ ÀÌ°É ÆÄÀϵîÀ¸·Î ÀúÀåÇÑÈÄ Âü°íÇÏ¸é µÈ´Ù.
 
[root@localhost test]# snmpwalk localhost public > snmp_info.dump  
			
snmpwalk ´Â GET NEXT¸¦ ÀÌ¿ëÇϸç À§ÀÇ °æ¿ì MIBÀ̸§À» ÁöÁ¤ÇÏÁö ¾Ê¾ÒÀ½À¸·Î root³ëµå¸¦ ÁöÁ¤Çß´Ù°í °£ÁÖÇÏ°í ¸ðµç MIBµ¥ÀÌŸ¸¦ ±Ü¾î¿Â´Ù. ¸¸¾à systemÇÏÀ§¿¡ ÀÖ´Â µ¥ÀÌŸµéÀ» ¿äûÇÑ´Ù¸é public ´ÙÀ½¿¡ systemÀ» ÁöÁ¤ÇØ ÁÖ¸é µÉ°ÍÀÌ´Ù.

¸¸¾à ¿ÜºÎ·Î ³ª°¡´Â ÆÐŶÀÇ ¾ç(Æ®·¡ÇÈ)À» °Ë»çÇÏ±æ ¿øÇÑ´Ù¸é ÀÏÁ¤½Ã°£°£°ÝÀ¸·Î "interfaces.ifTable.ifEntry.ifOutOctets.2" Á¤º¸¸¦ ¿äÃ»ÇØ¼­ Åë°è¸¦ ³»¸é µÈ´Ù. ÀÌ·±½ÄÀ¸·Î ÇØ¼­ ÃÖ¼ÒÇÑÀÇ ³×Æ®¿öÅ© °ü¸®¸¦ À§ÇÑ Á¤º¸¼öÁýÀÌ °¡´ÉÇØ Áø´Ù.


2.3절. ´Ù¸¥ ¿¹Á¦ : ºñµ¿±â µ¥ÀÌŸ ¿äû

¿ì¸®´Â 2.2절¿¡¼­ snmpÀÀ¿ë ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µé±â À§ÇÑ ±âº»ÀûÀÎ ³»¿ëµé¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. À§¿¡¼­ ¸¸µé¾îÁø ¿¹Á¦ÇÁ·Î±×·¥Àº µ¿±âÇü½ÄÀ» °¡Áø´Ù. Áï ¿äûÀ» º¸³»°í ÀÀ´äÀÌ ÀÖÀ»¶§±îÁö ÇØ´ç¿µ¿ª¿¡¼­ ºí·°Å·µÇ´Âµ¥, ÀÌ·¯ÇÑ ¸ðµ¨Àº ´ÜÁö ¸î°³ÀÇ ¿¡ÀÌÀüÆ®·Î ºÎÅÍ µ¥ÀÌŸ¸¦ ¹ÞÀ» °æ¿ì ¹®Á¦°¡ ¾øÁö¸¸, ¿©·¯°³ÀÇ ¿¡ÀÌÀüÆ®·ÎºÎÅÍ µ¥ÀÌŸ¸¦ ¹ÞÀ» °æ¿ì ¹®Á¦ÀÇ ¼ÒÁö°¡ ÀÖ´Ù. NMSÀÇ Æ¯¼º»ó ´Ù¼öÀÇ ¿¡ÀÌÀüÆ®¸¦ ÇϳªÀÇ ¸Þ´ÏÀú¿¡¼­ °ü¸®ÇؾßÇÏ´Â °æ¿ì°¡ ¸¹À½À¸·Î µ¿±â¸ðµ¨·Î ¸Þ´ÏÀúÇÁ·Î±×·¥À» ¸¸µå´Â°ÍÀº ¾Æ¹«·¡µµ ¹®Á¦°¡ À־ÀδÙ.

ÀÌ·¯ÇÑ ¹®Á¦ÀÇ ÇØ°áÀ» À§Çؼ­ ucd-snmp´Â ºñµ¿±â¸ðµ¨·Î ¸Þ´ÏÀú¸¦ ÀÛ¼ºÇÒ¼ö ÀÖµµ·Ï ¹æ¹ýÀ» Á¦°øÇϰí ÀÖ´Ù. ¾ð¶æ »ý°¢Çصµ udp¸¦ »ç¿ëÇÏ´Â snmp¿¡´Â ºñµ¿±â¸ðµ¨ÀÇ ¾îÇø®ÄÉÀ̼ÇÀÌ ´õ ¾î¿ï¸±°Å¶ó°í »ý°¢ÇÒ¼ö ÀÖ´Ù.

´ÙÀ½Àº ¿¹Á¦ÀÌ´Ù. Ưº°È÷ ¾î·Á¿öº¸ÀÌ´Â °Ç ¾øÀ»°ÍÀÌ´Ù. ³»¿ë¿¡ ´ëÇÑ ¼³¸íÀº ÁÖ¼®À¸·Î ´ë½ÅÇÑ´Ù.

asynch_snmp.c
#include <ucd-snmp/ucd-snmp-config.h>
#include <ucd-snmp/ucd-snmp-includes.h>
#include <stdio.h>

/*
 * ¿¡ÀÌÀüÆ® È£½ºÆ® Á¤º¸
 * È£½ºÆ® À̸§°ú Ä¿¹Â´ÏƼ À̸§À» Á¤ÀÇÇÑ´Ù. 
 */
struct host
{
    const char *name;
    const char *community;
} hosts[] =
{
    {"localhost", "public"},
    {NULL}
};

/*
 * °¡Á®¿À°íÀÚ ÇÏ´Â oid¸¦ Á¤ÀÇ ÇÑ´Ù. 
 * ¿©±â¿¡¼­´Â ½Ã½ºÅÛ uptime°ú,  
 * eth0ÀÇ ½ºÇǵå(10Mbps)
 * ¿ÜºÎ·Î ³ª°£ ÆÐŶÀÇ °¹¼ö¸¦ ¾ò¾î¿À±â À§ÇÑ oid¸¦ Á¤ÀÇ Çß´Ù.
 */
struct oid
{
    const char *name;
    oid Oid[MAX_OID_LEN];
    int OidLen;
} oids[] =
{
    {"system.sysUpTime.0"},
    {"interfaces.ifTable.ifEntry.ifSpeed.2"},
    {"interfaces.ifTable.ifEntry.ifOutOctets.2"},
    {NULL}
};

/*
 * snmp ÃʱâÈ­
 * snmp¸¦ ÃʱâÈ­ Çϰí
 * oidÀ̸§À» ÀоîµéÀδÙ. 
 * ¸¸¾à oidÀ̸§¿¡ ¹®Á¦°¡ ÀÖ´Ù¸é ¿À·ù¸¦ ¹ß»ý½Ãų °ÍÀÌ´Ù.
 */
void initialize(void)
{
    struct oid *op = oids;
    init_snmp("asynchapp");
    while(op->name)
    {
        op->OidLen = sizeof(op->Oid)/sizeof(op->Oid[0]);
        if (!read_objid(op->name, op->Oid, &op->OidLen))
        {
            snmp_perror("read_objid");
            exit(1);
        }
        op++;
    }
}
/*
 * ¿¡ÀÌÀüÆ®·Î ºÎÅÍ ³Ñ¾î¿Â °ªÀ» Ãâ·ÂÇÑ´Ù.
 */
int print_result(int status,
                struct snmp_session *sp,
                struct snmp_pdu *pdu)
{
    char buf[1024];
    struct variable_list *vp;

    int ix;
    struct timeval now;
    struct timezone tz;
    struct tm *tm;

    /*
     * ÃÖ±ÙÀÇ ÇÁ·Î±×·¥µéÀº 
     * timeÇÔ¼ö gettimeofday¸¦ ¼±È£ÇÑ´Ù. 
     */
    gettimeofday(&now, &tz);
    tm = localtime(&now.tv_sec);
    fprintf(stdout, "%.2d:%.2d:%.2d.%.6d ",
                    tm->tm_hour, tm->tm_min, tm->tm_sec,
                    now.tv_usec);

    switch(status)
    {
        /*
         * ¿¡ÀÌÀüÆ®·ÎºÎÅÍ ³Ñ¾î¿Â °ªÀ» Ãâ·ÂÇÑ´Ù. 
         */
        case STAT_SUCCESS:
            vp = pdu->variables;
            if (pdu->errstat == SNMP_ERR_NOERROR)
            {
                while(vp)
                {
                    snprint_variable(buf, sizeof(buf),
                        vp->name, vp->name_length, vp);
                    fprintf(stdout, "%s: %s\", sp->peername, buf);
                    vp = vp->next_variable;
                }
            }
            else
            {
                printf("error\");
            }
            return 1;
        /*
         * ³×Æ®¿öũȤÀº ´Ù¸¥ ¹®Á¦·Î ¿¡ÀÌÀüÆ®·Î ºÎÅÍ ÀÀ´äÀÌ  
         * ¹ß»ýÇÏÁö ¾Ê¾ÒÀ»°æ¿ì
         */
        case STAT_TIMEOUT:
            fprintf(stdout, "%s: Timeout\", sp->peername);
            return 0;

        case STAT_ERROR:
            snmp_perror(sp->peername);
            return 0;
    }
    return 0;
}

/*
 * snmp oid ¼¼¼ÇÀ» ¸¸µç´Ù. Å©±â´Â ¿¡ÀÌÀüÆ®ÀÇ °¹¼ö¸¸Å­ÀÌ´Ù. 
 */
struct session
{   
    struct snmp_session *sess;
    struct oid *current_oid;
    
} sessions[sizeof(hosts)/sizeof(hosts[0])];
    
int active_hosts;

/*
 * ¿¡ÀÌÀüÆ®·ÎºÎÅÍÀÇ ºñµ¿±â ÀÀ´äÀ» ¹Þ¾ÒÀ»°æ¿ì 
 * À̸¦ ó¸®ÇÑ´Ù. 
 * °á°ú°¡ ³Ñ¾î¿Â´Ù¸é print_resultÇÔ¼ö¸¦ È£ÃâÇØ¼­ 
 * °á°ú¸¦ Ãâ·ÂÇÑ´Ù.
 * ÀÌ ÇÔ¼ö´Â callbackÇü½ÄÀ¸·Î È£ÃâµÇ´Âµ¥, 
 * Áï ÀÓÀÇÀÇ ¿¡ÀÌÀüÆ®·ÎºÎÅÍ µ¥ÀÌŸÀÔ·ÂÀÌ ÀÖÀ»°æ¿ì È£ÃâµÇ´Â Çü½ÄÀÌ´Ù. 
 */
int asynch_response(int operation, struct snmp_session *sp,
                int reqid, struct snmp_pdu *pdu, void *magic)
{   
    struct session *host = (struct session *)magic;
    struct snmp_pdu *req;

    /*
     * ¸¸¾à operationÀÌ µ¥ÀÌŸ ¹ÞÀ½À̶ó¸é 
     * print_result¸¦ È£ÃâÇØ¼­ µ¥ÀÌŸ¸¦ Ãâ·ÂÇÑ´Ù. 
     */
    if (operation == RECEIVED_MESSAGE)
    {
        if (print_result(STAT_SUCCESS, host->sess, pdu))
        {
            host->current_oid++;
            if (host->current_oid->name)
            {
                req = snmp_pdu_create(SNMP_MSG_GET);
                snmp_add_null_var(req, host->current_oid->Oid,
                                host->current_oid->OidLen);
                if (snmp_send(host->sess, req))
                {
                    return 1;
                }
                else
                {
                    snmp_perror("snmp_send");
                    snmp_free_pdu(req);
                }
            }
        }
    }
    else
    {
        print_result(STAT_TIMEOUT, host->sess, pdu);
    }
    active_hosts--;
    return 1;
}

/*
 * snmp sessionÀ» ¸¸µé°í 
 * ºñµ¿±â·Î °á°ú¸¦ ¹Þ±â À§Çؼ­ callback ÇÔ¼ö¸¦ µî·Ï½ÃŲ´Ù. 
 */
void asynchronous(void)
{
    struct session *hs;
    struct host *hp;

    for (hs = sessions, hp = hosts; hp->name; hs++, hp++)
    {

        /*
         * ¿©±â´Â µ¿±âÇü½Ä°ú ¸¶Âù°¡Áö·Î ´ÜÁö snmp¼¼¼ÇÀ» 
         * ¸¸µé±â À§ÇÑ Á¤º¸¸¦ ÀÔ·ÂÇÑ´Ù.
         */
        struct snmp_pdu *req;
        struct snmp_session sess;
        snmp_sess_init(&sess);
        sess.version = SNMP_VERSION_2c;
        sess.peername = strdup(hp->name);
        sess.community = strdup(hp->community);
        sess.community_len = strlen(sess.community);

        // ¹Ù·Î ¿©±â callback ÇÔ¼ö¸¦ µî·ÏÇÑ´Ù. 
        sess.callback = asynch_response;
        sess.callback_magic = hs;

        if (!(hs->sess = snmp_open(&sess)))
        {
            snmp_perror("snmp_open");
            continue;
        }
        hs->current_oid = oids;
        req = snmp_pdu_create(SNMP_MSG_GET);
        snmp_add_null_var(req, hs->current_oid->Oid, hs->current_oid->OidLen);

        /*
         * ºñµ¿±âÀ̱⠶§¹®¿¡ snmpµ¥ÀÌŸ¸¦ º¸³»°í.. 
         * ÀÀ´äÀ» ±â´Ù¸®±â À§Çؼ­ ºí·°µÇÁö ¾Êµµ·Ï ÇÑ´Ù.  
         */
        if (snmp_send(hs->sess, req))
        {
            active_hosts++;
        }
        else
        {
            snmp_perror("snmp_send");
            snmp_free_pdu(req);
        }
    }

    /*
     * ºñµ¿±â µ¥ÀÌŸ ÀÔ·ÂÀ» È®ÀÎÇϱâ À§Çؼ­ 
     * select¸¦ ÀÌ¿ëÇÑ´Ù. 
     * È£½ºÆ®ÀÇ °¹¼ö¸¸Æ´À» select¸¦ ÅëÇØ ±â´Ù¸°´Ù.  
     */
    while(active_hosts)
    {
        int fds = 0, block = 1;
        fd_set fdset;

        struct timeval timeout;

        FD_ZERO(&fdset);
        snmp_select_info(&fds, &fdset, &timeout, &block);
        fds = select(fds, &fdset, NULL, NULL, block ? NULL : &timeout);
        if (fds)
        {
            snmp_read(&fdset);
        }
        else
        {
            snmp_timeout();
        }   
    }
    for (hp = hosts, hs = sessions; hp->name; hs++, hp++)
    {
        if(hs->sess) snmp_close(hs->sess);
    }
}

int main()
{
    initialize();
    asynchronous();
}
			

¿©·¯°³ÀÇ ¿¡ÀÌÀüÆ®¸¦ µî·Ï½ÃÄѼ­ Å×½ºÆ®ÇÒ¼ö ÀÖ¾úÀ¸¸é ÇßÀ¸³ª »ç¿ëÇÒ ¿¡ÀÌÀüÆ®°¡ ÇÑÁ¤µÈ °ü°è·Î ÇϳªÀÇ ¿¡ÀÌÀüÆ®¸¸À» µî·Ï½ÃÄѼ­ Å×½ºÆ®Çß´Ù. ´ÙÀ½Àº Å×½ºÆ® °á°úÀÌ´Ù.

¸¸¾à ¿¡ÀÌÀüÆ®°¡ ½ÇÇàÁßÀÌÁö ¾Ê´Ù¸é ŸÀӾƿô ¿¡·¯°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù.
[root@localhost c_source]# ./snmp_as 
23:54:48.463404 localhost: Timeout
			
¿¡ÀÌÀüÆ®°¡ ½ÇÇàÁßÀ̶ó¸é °ªÀ» °¡Á®¿À°Ô µÉ°ÍÀÌ´Ù.
[root@localhost c_source]# ./snmp_as 
23:55:55.536827 localhost: system.sysUpTime.0 = Timeticks: (6401) 0:01:04.01
23:55:55.539176 localhost: interfaces.ifTable.ifEntry.ifSpeed.2 = Gauge32: 10000000
23:55:55.540540 localhost: interfaces.ifTable.ifEntry.ifOutOctets.2 = Counter32: 4236
			


3절. °á·Ð

ÀÌ»ó snmpµ¥ÀÌŸ¸¦ °¡Á®¿À±â À§ÇÑ ¸î°¡Áö ¹æ¾Èµé¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. ¿©±â¿¡¼­´Â ´ÜÁö GET¸Þ¼­µå¿¡ ´ëÇÑ ³»¿ë¸¸ ´Ù·ç°í Àִµ¥ GET NEXT´Â ´ÙÀ½¹ø¿¡ º°µµ·Î ´Ù·çµµ·Ï ÇÒ°ÍÀÌ´Ù.