![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение ip-адреса компьютера с которого приходят сообщения. [D7, Win2k]
r9000 © (2004-05-24 12:22:00)Добрый день!
Не могли бы вы мне помочь, пожалуйста? На компьютер по протоколу
snmp приходят сообщения. Как можно определить ip-адреса компьютера с которого приходят сообщения? Компонент IdUDPServer мне не подойдет, потому что функция RecvTrap(Dest, Source, Enterprise, Community,Generic, Specific, Seconds, MIBName, MIBValue)<>0 в процедуре IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle) не хочет работать даже когда ипользую IdUDPServer1.Active:=false в таймере
Alexander1966 (2004-07-20 17:49:00) [1]А idSNMP не поможет?
Yegorchic (2004-07-19 03:40:00) [2]11111//eee
r9000 (2004-05-26 06:45:00) [3]Да я понимаю, что структура 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, а мне же его нужно обработать.
Что делать?
tesseract (2004-05-25 09:35:00) [4]ЭЭЭ когда сервер не активен - он посылает все сообщения напрочь. 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;