쓸만한 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의
- 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 |