Сейчас на форуме: hgdagon, asfa (+3 невидимых)

 eXeL@B —› Программирование —› Sniffer.Winpcap.Delphi.PacketX.
Посл.ответ Сообщение

Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 13 июня 2007 22:42
· Личное сообщение · #1

Здрасте. Начну с главного.
Пишу сниффер на делфи используя winpcap и варпер packetx.
В принципе сниффер работает, но вот скорость обработки пакетов меня не устраивает.
Получаю пакет с определенного порта, получаю пакет типа OleVariant... например..
обрабатываю событе OnPacket.
есть переменная pPacket типа IPktXPacket (ppacket:IPktXPacket)
далее
ppacket.data <----это и есть пакет..
так вот эта data типа olevariant я могу обратится к каждому байту в этом массиве по индексу, но мне нужно перевести это data в строку или в массив байт. Как делаю я сейчас, я побайтно перевожу из olevariant в string
var
s:string;
i:integer;
begin
s:='';
for i:=0 to ppacket.datasize do
begin
s:=s+chr(ppacket.data[i]);
end;
end;
это долго.. очень долго... я понял что мне нужно воспользоваться Copymemory()
НО
var
s:string;
begin
s:='';
setlength(s,ppacket.datasize);
copymemory(@s[1],@ppacket.data[0],ppacket.datasize);//<-- ошибка именно тут.. на стадии компиляции...
end;

Я делал новый проект там создавал:
type
dada=record
dad:olevariant;
end;
var
s:string;
p:dada;
begin
dada.dad:='adadadqe';
s:='';
setlength(s, length(dada.dad));
copymemory(@s[1],@dada.dad[1],length(dada.dad));//тут все работает
end;
как я понял ошибка в том что, ppacket.data это property типа olevariant ...а dada.dad это поле записи типа olevariant, так вот собственно вопрос.
Как получить адрес этого блин проперти...?
Я понимаю что это достаточно узкий вопрос... но всетаки может кто поможет... буду очень благодарен....



Ранг: 20.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 14 июня 2007 15:23 · Поправил: Player
· Личное сообщение · #2

Так вроде есть DataArray, возвращающий массив байт.
По поводу получения адреса property то в общем случае нельзя, т.к. там могут возвращаться временные объекты, а не реальные данные буфера.

А так вообще, можно оставить по-старому только вместо copymemory написать цикл (s[i+1] := packet.data[i];) , не лучший вариант конечно, но будет быстрее s := s + chr...



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 июня 2007 15:50
· Личное сообщение · #3

Player, спасибо за совет, но я сделал финт ушами и подзабил на этот PacketX. Нашел нечто другое Internet Packet Monitoring Components собственно тоже самое (использует WinPcap) только на первый взгляд получше... после обучения его взятия SEQа из и TCP мне подходит...
ЗЫ: хотя можно проверить так и так




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 15 июня 2007 15:54
· Личное сообщение · #4

Nefer

Необходимо знать хотябы азы производительности при s:=s+chr(ppacket.data[i]); после каждого сложения создается новая строка на 1 char больше старой, после этого туда копируется старая строка + char, квадратичные затраты. Я не знаю как это в гавнаделфи делается но в сях проще получить указатель нужного типа на этот буфер.

-----
have a nice day



 eXeL@B —› Программирование —› Sniffer.Winpcap.Delphi.PacketX.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати