Форум: "Сети";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизОпределение ip-адреса компьютера с которого приходят сообщения. Найти похожие ветки
← →
r9000 (2004-05-24 12:22) [0]Добрый день!
Не могли бы вы мне помочь, пожалуйста? На компьютер по протоколу
snmp приходят сообщения. Как можно определить ip-адреса компьютера с которого приходят сообщения? Компонент IdUDPServer мне не подойдет, потому что функция RecvTrap(Dest, Source, Enterprise, Community,Generic, Specific, Seconds, MIBName, MIBValue)<>0 в процедуре IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle) не хочет работать даже когда ипользую IdUDPServer1.Active:=false в таймере
← →
tesseract © (2004-05-25 09:35) [1]ЭЭЭ когда сервер не активен - он посылает все сообщения напрочь. Active - функция долгая и не надо её использовать без необходимости. UDP не гарантирует доставки. тебе приходит структура Abinding где есть параметр PeerIP - он и есть нужный тебе IP.
Пример, Active установлен в True при запуске. Здесь получаем ответ от широковещательного сообщения.
procedure TfmScaleAssign.tibboUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var tmp:string;
recIP:string;
recPort:integer;
sz:integer;
buf:array[1..40] of byte;
tb:integer;
begin
tmp:="";
sz:=adata.Size;
for recport:=1 to 40 do buf[recport]:=0;
recIP:=abinding.peerip;
recPort:=abinding.PeerPort;
if sz>1 then
begin
tb:=sz;
with aData as TmemoryStream do
adata.ReadBuffer(buf,sz);
for tb:=2 to sz do
tmp:=tmp+chr(buf[tb]);
tibboinfo:=tscaleinfo.Create;
tibboinfo.ip:=recIP;
tibboinfo.name:="";
tibboinfo.mac:=copy(tmp,1,pos("/",tmp)-1);
delete(tmp,1,pos("/",tmp));
tibboinfo.port:=strToint(copy(tmp,1,pos("/",tmp)-1));
findscales.Add(tibboinfo);
lbFind.Items.Add(recIP);
end;
end;
← →
r9000 (2004-05-26 06:45) [2]Да я понимаю, что структура Abinding где есть параметр PeerIP - и есть нужный IP, но достать его можно только если IdUDPServer1.Active:=True в процедуре IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle), но
дело в том что я использую модуль с функцией RecvTrap(Dest, Source, Enterprise, Community,Generic, Specific, Seconds, MIBName, MIBValue)<>0, позволяющая получить значения в snmp сообщении(потому что обработку adata.ReadBuffer(buf,sz) для snmp сообщений версии 2 с помощью компонента IdUDPServer непонятно,как сделать, чисто по формату snmp сообщений в виде записи не получается), которая при IdUDPServer1.Active:=True не работает, а при IdUDPServer1.Active:=false пропускает то snmp сообщение, которое делает IdUDPServer1.Active:=false, а мне же его нужно обработать.
Т.е. так
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
Memo1.Lines.Add("Ip-адресс сообщения: "+abinding.PeerIP+" Время поступления сообщения: "+ datetimetostr(now));
Timer1.Enabled:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
IdUDPServer1.Active:=true;
end;
procedure TForm1.Pr_snmp;
var
Dest, Source, Enterprise, Community: AnsiString;
Generic, Specific, Seconds,i: Integer;
MIBName, MIBValue: TStringList;
response,s:AnsiString;
begin
// IdUDPServer1.Active:=false;
MIBName := TStringList.Create;
MIBValue := TStringList.Create;
Application.ProcessMessages;
if RecvTrap(Dest, Source, Enterprise, Community,Generic, Specific, Seconds, MIBName, MIBValue)<>0 then
begin
Memo1.Lines.Add("Время(в сек)-sysUpTime:"+MIBValue[0]);
if MIBValue[1]="1.3.6.1.4.1.3321.2.2.1.4.0.1" then
begin
Memo1.Lines.Add("snmpTrapOID.0: baAlarm1");
Memo1.Lines.Add("Состояние(baAlarmElementsState): "+MIBValue[2]);
Memo1.Lines.Add("Сигнальная категория(baAlarmElementsCategory): "+MIBValue[3]);
Memo1.Lines.Add("Код сигнала(baAlarmElementsCode): "+MIBValue[4]);
Memo1.Lines.Add("Тип аварии(baAlarmElementsSeverity): "+MIBValue[5]);
Memo1.Lines.Add("Сервис(baAlarmElementsServiceAffect): "+MIBValue[6]);
Memo1.Lines.Add("Модуль Id(baAlarmElementsUnitId): "+MIBValue[7]);
Memo1.Lines.Add("Тип элемента(baAlarmElementsElementType): "+MIBValue[8]);
Memo1.Lines.Add("Слот(baAlarmElementsCageSlot): "+MIBValue[9]);
Memo1.Lines.Add("Порт(baAlarmElementsPort): "+MIBValue[10]);
Memo1.Lines.Add("Индекс(baAlarmElementsEntityIndex): "+MIBValue[11]);
Memo1.Lines.Add("SDH иерархия(baAlarmElementsSDHHeierarchy): "+MIBValue[12]);
Memo1.Lines.Add("Время и дата(baAlarmElementsTimeDate): "+MIBValue[13]);
Memo1.Lines.Add("Название сигнала(baAlarmElementsAlarmName): "+MIBValue[14]);
Memo1.Lines.Add("АТМ Слот(baAlarmElementsAtmSlot): "+MIBValue[15]);
Memo1.Lines.Add("АТМ Порт(baAlarmElementsAtmPort): "+MIBValue[16]);
Memo1.Lines.Add("АТМ Vpi(baAlarmElementsAtmVpi): "+MIBValue[17]);
Memo1.Lines.Add("АТМ Vci(baAlarmElementsAtmVci): "+MIBValue[18]);
Memo1.Lines.Add("Тип создания(baAlarmElementsOriginatorType): "+MIBValue[19]);
Memo1.Lines.Add("Идентификатор аварии(baAlarmElementsAlarmID): "+MIBValue[20]);
end
else
Begin
Memo1.Lines.Add("Nothing...");
End;
MIBName.Destroy;
MIBValue.Destroy;
IdUDPServer1.Active:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=false;
IdUDPServer1.Active:=false;
IdUDPServer1.DefaultPort:=0;
Timer2.Enabled:=true;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
Timer2.Enabled:=false;
Pr_snmp;
end;
Но только этот код не обрабатывает snmp сообщение, которое делает IdUDPServer1.Active:=false, а мне же его нужно обработать.
Что делать?
← →
Yegorchic © (2004-07-19 03:40) [3]11111//eee
← →
Alexander1966 (2004-07-20 17:49) [4]А idSNMP не поможет?
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.033 c