![]() |
eXeL@B —› Программирование —› Sniffer.Winpcap.Delphi.PacketX. |
Посл.ответ | Сообщение |
|
Создано: 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, так вот собственно вопрос. Как получить адрес этого блин проперти...? Я понимаю что это достаточно узкий вопрос... но всетаки может кто поможет... буду очень благодарен.... ![]() |
|
Создано: 14 июня 2007 15:23 · Поправил: Player · Личное сообщение · #2 Так вроде есть DataArray, возвращающий массив байт. По поводу получения адреса property то в общем случае нельзя, т.к. там могут возвращаться временные объекты, а не реальные данные буфера. А так вообще, можно оставить по-старому только вместо copymemory написать цикл (s[i+1] := packet.data[i];) , не лучший вариант конечно, но будет быстрее s := s + chr... ![]() |
|
Создано: 14 июня 2007 15:50 · Личное сообщение · #3 Player, спасибо за совет, но я сделал финт ушами и подзабил на этот PacketX. ![]() ЗЫ: хотя можно проверить так и так ![]() ![]() |
|
Создано: 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. |