2013-04-22 5 views
0

Microsoft WinSNMP API을 사용하여 Windows 응용 프로그램 용 SNMP 에이전트를 구축하고 있습니다. 현재 모든 항목은 단일 항목 getset-request, 그리고 정의 된 트리를 걷는 데 허용되는 get-next (이 질문과 관련없는 일부주의 사항이 있음)에도 사용할 수 있습니다.PDU가 WinSNMP에서 너무 큰 경우 어떻게 테스트해야합니까?

이제 다중 품목 getget-bulk을 검토 중입니다.

현재 진행중인 절차는 요청 된 항목 (PDU 내의 varbindlist)의 목록을 반복하고 각 항목을 개별적으로 처리하여 효과적으로 내부에 get을 발생시키는 것입니다. 결과는 VBL에 추가되고 PDU로 설정된 다음 유효하지 않은 요청 등을 고려하여 SNMP 관리자에게 다시 전송됩니다.

제 질문은 "너무 많은"데이터를 어떻게 처리해야합니까? 단일 전송 계층 메시지에 적합)? 또는 더 정확히 말하면 실제로 전송하지 않고 데이터가 "너무 큰지"여부를 테스트 할 수있는 방법이 있습니까? API에서 볼 수있는 유일한 방법은 전송을 시도하고 오류를 확인한 다음 다시 시도하는 것입니다. 이것을 get-request의 경우

문제가되지 않습니다 - 당신이 요청 된 모든 데이터를 반환 할 수없는 경우, 당신은 실패 그래서 전송 시도와 오류 보고서가 SNMPAPI_TL_PDU_TOO_BIG 경우, 기본 "오류"를 보내 PDU.

그러나 부분 결과는 bulk-get에 대한 응답으로 허용됩니다.

내가 처리 할 수있는 유일한 방법은 항목을 제거하고 다시 시도하는 지루한 (?) 반복문입니다. 다음 (간결함을 제거 몇 가지 세부 사항)과 비슷한 :

// Create an empty varbindlist 
vbl = SnmpCreateVbl(session, NULL, NULL); 
// Add all items to the list 
SnmpSetVb(vbl, &oid, &value); // for each OID/Value pair 
// Create the PDU 
pdu = SnmpCreatePdu(session, SNMP_PDU_RESPONSE, ..., vbl); 
bool retry; 
do { 
    retry = false; 
    smiINT failed = SnmpSendMsg(session, ..., pdu); 
    if (failed && SNMPAPI_TL_PDU_TOO_BIG == SnmpGetLastError()) { 
     // too much data, delete the last vb 
     SnmpDeleteVb(vbl, SnmpCountVbl(vbl)); 
     SnmpSetPduData(pdu, ..., vbl); 
     retry = true; 
    }; 
} while(retry); 

이것은 최적의 방법은 아닌 것 같아 - 내가보고 싶었어 또 다른 방법은 무엇입니까? 사이드 참고로


, 나는 같은 그물 SNMP와 같은 라이브러리에 대해 알고 있지만, 내 질문은 마이크로 소프트 API에 따라 다릅니다.

답변

0

은 RFC는

http://tools.ietf.org/html/rfc3416

읽기 페이지, 붙여 넣은 일을하도록 요구하지 않습니다 당신을 위해이 작업을 수행 할 수 있습니다 WinSNMP API에 의해 노출 된 기능이있을 것 같지 않습니다

(16) , 그래서 당신은 그것을 처리하기 위해 자신의 논리를 작성해야합니다.

+0

나는 그게 어떻게 될지 거의 생각. PDU를 만들고 있는데 너무 많은 데이터가 있으면 조금씩 제거하고 다시 시도하십시오. 일하는 것 같습니다 :) 건배. – icabod

+0

기분이 나아진다면 net-snmp (linux)는 현재 포기하고 PDU가 너무 크면 응답하지 않습니다. 나는 그것이 당신이 만들고있는 것을 해줬 으면 좋겠다. 그들은 같은 방식으로해야 할 것입니다. 크기가 어떻게 될지에 대해 집중적 인 계산을 할 수 있지만, 근본적으로 패킷을 만들어서 어쨌든 계산할 수 있습니다. 그래서 지루한 루프는 그렇게 나쁘지 않습니다. –