SNMP-ловушка Indy ничего не отправляет
Я попытался отправить SNMP Trap, используя компонент TIdSnmp от Indy. (Код был скопирован из реализации SNMP SendTrap с использованием компонентов Indy)
void __fastcall TMainForm::btSendTrapClick(TObject *Sender)
{
String myEnterprise = _D("1.5.5.5.5.5.5.5");
String eventType = myEnterprise + _D(".1");
String eventDistance = myEnterprise + _D(".2");
TIdSNMP * idSnmp = 0;
idSnmp = new TIdSNMP(NULL);
idSnmp->Trap->Host = edHost->Text;
idSnmp->Trap->Community = _D("public");
idSnmp->Trap->Enterprise = myEnterprise;
idSnmp->Trap->GenTrap = 6; // I've met such values
idSnmp->Trap->SpecTrap = 1; // somewhere in inet
idSnmp->Trap->MIBAdd(eventType,_D("ftCritical"));
idSnmp->Trap->MIBAdd(eventDistance,_D("2.357"));
idSnmp->SendTrap();
delete idSnmp;
}
Но Wireshark не регистрирует любую сетевую активность. Я пробовал вариант с QuickSendTrap
с тем же результатом. В отчаянии я решил попробовать UDP-компонент Indy для отправки чего-либо.
void __fastcall TForm1::btFireClick(TObject *Sender)
{
TIdUDPClient* udpClient = 0;
TIdBytes sendData;
myClass* packet = new myClass();
packet->a = 10;
packet->b = 77;
packet->c = "Test";
int size = sizeof(*packet);
sendData = RawToBytes(packet, size);
udpClient = new TIdUDPClient(NULL);
udpClient->Host = "192.168.100.19";
udpClient->Port = 162;
udpClient->SendBuffer(sendData);
delete udpClient;
}
Конечно, это не настоящая ловушка SNMP, но Wireshark видит это:
192.168.100.21 192.168.100.19 UDP 54 Source port: 49873 Destination port: snmptrap
Фильтр Wireshark является "UDP Portrange 161-162"
И в разделе данных я могу найти мои значения. Кстати, компонент SNMP работает правильно для получения значений простым idSnmp->SendQuery(), и это также регистрируется wireshark.
Итак, есть ли дополнительные условия, чтобы SendTrap() работал правильно?
У меня Windows7, права администратора. Брандмауэр выключен. Код, скомпилированный Embarcadero RAD Studio 2010, настольное приложение.
Должен ли получатель SNMP Trap ждать моего SendTrap() только для того, чтобы SendTrap() мог работать? (к сожалению, на данный момент у меня нет другого компьютера для экспериментов) Должен ли OID "1.5.5.5.5.5.5.5" быть зарегистрированным где-то на моем компьютере только для того, чтобы SendTrap() мог работать?
Может быть, какие-то другие требования?
1 ответ
Но wireshark не регистрирует сетевую активность
Это не то, что вы сказали в другой дискуссии. Вы сказали, что это работает.
Итак, есть ли дополнительные условия, чтобы SendTrap() работал правильно?
Нет. Код, который я тебе дал, это все, что тебе нужно.
Должен ли получатель SNMP Trap ждать моего SendTrap() только для того, чтобы SendTrap() мог работать?
Нет. UDP не требует соединения. Приемник не требуется для отправки. Если получателя нет, ошибка ICMP будет отправлена обратно отправителю.
Должен ли OID "1.5.5.5.5.5.5.5" быть зарегистрирован где-нибудь на моем компьютере только для того, чтобы SendTrap() мог работать?
Нет.