본문 바로가기

Programing

SNMP - 래퍼 Rogério Paulo

쓸만한 WinSNMP Wrapper Class

SNMP - A C++ Wrapper for the WinSnmp library

http://www.codeproject.com/KB/library/WinSNMPWrapper.aspx?display=Print 


클래스 다이어그램까지 잘 만들어져 있다.

실행파일, 프로젝트 파일 두 가지 형태로 배포되고 있는데, Visual Stdio 2003이 있다면 바로 컴파일해서 사용할 수 있다.

주의할 점

이 라이브러리는 알려진 버그와 콘솔이 뜨는 문제가 있다.

알려진 버그

불규칙하게 메모리 쓰기 오류문제

이 라이브러리를 사용하다 보면 불규칙적으로 메모리 충돌이 일어난다.

(그런데 이상하게 Debug 모드로 컴파일하면 문제가 안 생기다가, Release 모드로 컴파일을 하면 문제가 발생한다.)

 

나의 디버거의 충돌위치는 free.c의

  1. retval = HeapFree(_crtheap, 0, pBlock);
    if (retval == 0)

부분이었다. 아마도 할당도 안한 메모리를 해제하려고 해서 그런 것으로 추정된다. 하지만 위치는 어딘가???

 

krom666이라는 분이 알려준 사항에 따르면.

<SNMPObject.cpp>의 다음 부분에 문제가 있다.

SNMPObject & SNMPObject::operator=(const SNMPObject & other) {
    _syntax = other._syntax;
    _bInit = other._bInit;
    _binary = other._binary;
    std::string oid = other.getOID();
    setOID(oid);
    _int = other._int;
    _uint = other._uint;
    _string = other._string;
    _octetsLen = 0;
    _octets = NULL;
    setOctets(other._octets, other._octetsLen);
    return *this;
}

 

setOID 구현부를 보면

void SNMPObject::setOID(std::string oid) {   
    if(_bInit) {
        SnmpFreeDescriptor(SNMP_SYNTAX_OCTETS, (smiLPOPAQUE)&_oid);
        _bInit = false;
    }
    if(oid != "") {
        if(SnmpStrToOid(oid.c_str(), &_oid) == SNMPAPI_FAILURE) {
            SNMP_THROW_ERROR("Could not convert OID from string representation", SnmpGetLastError(NULL), SNMP_ERROR);
        }
        _bInit = true;
    }
}

로 되어 있는데, bInit이 true일 경우 SnmpFreeDescriptor를 시켜버린다는 것이다.

다음과 같은 상황에서는 에러가 발생할 수 있다는 것.

SNMPObject nObj, oObj;

oObj.setOID("1.3.6.1.2.1.1.1.0");   // oObj._bInit는 'true'로 세팅이 된다.

nObj = oObj;      // <== 에러!!   : operator=에 의해 nOjb._bInit가 'true'로 세팅이 되버린다.(이게 문제)

 

정리하면 :

nObj (초기화 됨: _bInit == true) = oObj(초기화 안됨: _bInit == false) OK

nObj (초기화 됨: _bInit == true) = oObj(초기화 됨: _bInit == true) OK

nObj (초기화 안됨: _bInit == false) = oObj(초기화 안됨: _bInit == false) OK

nObj (초기화 안됨: _bInit == false) = oObj(초기화 됨: _bInit == true) 문제!!

 

콘솔이 뜨는 현상

디버깅을 하기 위한 Trace 때문이다.

 

분석

SNMP 장치로 보낸 것(SNMPRemoteAgent.execute())을 받아오는 것은 콜백함수에 있다.

<SNMPSession.cpp>

L.59 : SNMPAPI_STATUS SNMPSession::processNotification(WPARAM wParam, LPARAM lParam)


'Programing' 카테고리의 다른 글

SNMP - 래퍼 net-snmp  (0) 2012.09.21
SNMP - 래퍼 SNMP Management  (1) 2012.09.21
SNMP 래퍼 클래스  (0) 2012.09.21
SNMP 프로그래밍  (0) 2012.09.21
MAC주소와 서브넷마스크 구하기  (0) 2012.09.21