Microsoft WinSNMP API을 사용하여 Windows 응용 프로그램 용 SNMP 에이전트를 구축하고 있습니다. 현재 모든 항목은 단일 항목 get
및 set-request
, 그리고 정의 된 트리를 걷는 데 허용되는 get-next
(이 질문과 관련없는 일부주의 사항이 있음)에도 사용할 수 있습니다.PDU가 WinSNMP에서 너무 큰 경우 어떻게 테스트해야합니까?
이제 다중 품목 get
및 get-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에 따라 다릅니다.
나는 그게 어떻게 될지 거의 생각. PDU를 만들고 있는데 너무 많은 데이터가 있으면 조금씩 제거하고 다시 시도하십시오. 일하는 것 같습니다 :) 건배. – icabod
기분이 나아진다면 net-snmp (linux)는 현재 포기하고 PDU가 너무 크면 응답하지 않습니다. 나는 그것이 당신이 만들고있는 것을 해줬 으면 좋겠다. 그들은 같은 방식으로해야 할 것입니다. 크기가 어떻게 될지에 대해 집중적 인 계산을 할 수 있지만, 근본적으로 패킷을 만들어서 어쨌든 계산할 수 있습니다. 그래서 지루한 루프는 그렇게 나쁘지 않습니다. –