Надо переписать перловый скрипт на си либо паскаль (неважно, лишь бы от скрипта избавиться).
Вот основной кусок, с которым у меня проблеммы:
$src_ip = inet_ntoa ( pack ( "N", unpack ( "%32l" , $src_ip ) ) );
$dst_ip = inet_ntoa ( pack ( "N", unpack ( "%32l" , $dst_ip ) ) );
$bytes = unpack ( "%32I" , $bytes );
$packets = unpack ( "%32I" , $packets );
$src_port = unpack ( "%16S" , $src_port );
$dst_port = unpack ( "%16S" , $dst_port );
$t_class = unpack ( "%16S" , $t_class );
$timestamp = unpack ( "%32I" , $timestamp );
Пытался разобраться, что тут вообще происходит, но это пока выше моих сил.
В общем подскажите, как то же самое реализовать. Была идея импортировать эти функции из perl58.dll... но тут я тоже неуверен, как правильно сделать. Словом мысли в эту сторону тоже приветствуются. Зачем писать заново, если есть готовое?
Самурай без меча подобен самураю с мечом, но только без меча...
Здравствуйте, Knuckles, Вы писали:
K>Надо переписать перловый скрипт на си либо паскаль (неважно, лишь бы от скрипта избавиться). K>Вот основной кусок, с которым у меня проблеммы: K> $src_ip = inet_ntoa ( pack ( "N", unpack ( "%32l" , $src_ip ) ) ); K> $dst_ip = inet_ntoa ( pack ( "N", unpack ( "%32l" , $dst_ip ) ) );
Функция inet_ntoa() преобразует IP-адрес in, заданный в
сетевом порядке расположения байтов, в стандартный
строчный вид, из номеров и точек. Строка располагается в
статически размещенном буфере; последующие вызовы
перепишут его данные.
Это отсюда. Думаю, из описания понятно, что должно было располагаться в $src_ip и dst_ip до этих двух строчек, и что оказалось там после.
K> $bytes = unpack ( "%32I" , $bytes ); K> $packets = unpack ( "%32I" , $packets ); K> $src_port = unpack ( "%16S" , $src_port ); K> $dst_port = unpack ( "%16S" , $dst_port ); K> $t_class = unpack ( "%16S" , $t_class ); K> $timestamp = unpack ( "%32I" , $timestamp ); K>Пытался разобраться, что тут вообще происходит, но это пока выше моих сил. K>В общем подскажите, как то же самое реализовать. Была идея импортировать эти функции из perl58.dll... но тут я тоже неуверен, как правильно сделать. Словом мысли в эту сторону тоже приветствуются. Зачем писать заново, если есть готовое?
Hint: доку по функциям pack/unpack можно посмотреть здесь и здесь.
Если кратко, то разбирается какая-то информация, явно связанная с работой с протоколом IP: в "пригодном для прочтения" и понимания виде получается информация об IP-адресах источника и приемника, числе [переданных|принятых] байт и пакетов, портах источника и приемника, и пр. Если хотите подробнее, приводите весь код.
PS импортировать это из perl58.dll скорее всего не получится, да и не нужно. Часто, функции Перл являются надстройками над аналогичными C-функциями в Unix, так что проще обратиться к первоисточнику.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Какая странная планета! — подумал Маленький принц. — Совсем сухая,
вся в иглах и соленая. И у людей не хватает воображения. Они только
повторяют то, что им скажешь...
Спасибо за подсказку. Уже разобрался что к чему примерно. Файл в итоге прочитал. Для этого достаточно было объявить такую структуру:
type
dStatRec = packed record
src_d:Byte;
src_c:Byte;
src_b:Byte;
src_a:Byte;
dst_d:Byte;
dst_c:Byte;
dst_b:Byte;
dst_a:Byte;
packets:LongWord;
bytes:LongWord;
src_port:Word;
dst_port:Word;
t_class:Word;
datetime:LongWord;
end;
...и читать как файл типа dStatRec. Теперь видимо можно оптимизировать это в свете использования функции inet_ntoa(). Просто я сперва думал, что перл своими функциями как-то сжимает данные, оказалось — нет. Осталась только одна небольшая проблемка. Не смог без шаманства раскодировать дату (последнее поле). Delphi функция UnixToDateTime возвращает результат больше на месяц без 6 часов, чем это делает перловский скрипт. GetLocalTime и другие не помогли. Теперь я просто перед вызовом этой функции отнимаю от прочитанного datetime магическое число. Только не совсем уверен, будет ли это всегда правильно работать.
Самурай без меча подобен самураю с мечом, но только без меча...
Здравствуйте, Knuckles, Вы писали:
K>...и читать как файл типа dStatRec. Теперь видимо можно оптимизировать это в свете использования функции inet_ntoa(). Просто я сперва думал, что перл своими функциями как-то сжимает данные, оказалось — нет. Осталась только одна небольшая проблемка. Не смог без шаманства раскодировать дату (последнее поле). Delphi функция UnixToDateTime возвращает результат больше на месяц без 6 часов, чем это делает перловский скрипт. GetLocalTime и другие не помогли. Теперь я просто перед вызовом этой функции отнимаю от прочитанного datetime магическое число. Только не совсем уверен, будет ли это всегда правильно работать.
Какая странная планета! — подумал Маленький принц. — Совсем сухая,
вся в иглах и соленая. И у людей не хватает воображения. Они только
повторяют то, что им скажешь...