Делаю работу с сокетами в free pascal.
Использую unit sockets, в rtl.pdf написано, что в нём есть константа
PF_PACKET , но компилятор говорит, что её нет:
socket(PF_PAKET,SOCKRAW,htons(ETH_P_ALL))
Тоже с ETH_P_ALL - в rtl.pdf написано, что она есть, а компилятор не находит её.
Эта ситуация в debian linux и windows lazarus.
free pascal unit sockets - не находит PF_PACKET, хотя в rtl.
Модератор: Модераторы
PF_PACKET прописана в ~/fpc/rtl/linux/unxsockh.inc, который вложен в unit Sockets. Достаточно в uses вписать Sockets и все находится. Возможно нужно прописать путь к *.inc файлу, но у меня он не прописан. Под Windows реализации нет, по крайней мере я ее не знаю 
Для примера даю свой рабоающий код для UNIX x86_64 платформы:
Добавлено спустя 5 минут 50 секунд:
В принципе, можете просто подставить 17 вместо константы, не очень красиво, но проверить работу можно
Добавлено спустя 11 минут 8 секунд:
Еще одно, совсем забыл, когда Вы устанавливали пакеты в Debian, то все пакеты установились? Там иногда нужно зависимости вручную ставить.
Для примера даю свой рабоающий код для UNIX x86_64 платформы:
Код: Выделить всё
unit sniffer;
{Get Ethernet packets, sort and agrigate size
}
interface
uses cthreads, libc, Sockets, sysutils, BaseUnix, vartypes;
implementation
//Thrid functin for cicled geting packets from socket
function GetPackets(arg: Pointer): PtrInt;
var sockLen: socklen_t;
P: PstoreRec;
begin
P := PstoreRec(arg);
sockLen := sizeof(sockaddr_ll);
P^.sock := fpsocket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
repeat
P^.onePackRec[P^.getPoint].fullsizepack :=
fprecvfrom(P^.sock,
@PstoreRec(arg)^.onePackRec[P^.getPoint].packBuff,
MAX_PACKET_SIZE,
0,
@P^.onePackRec[P^.getPoint].fromaddr,
@sockLen);
InterLockedIncrement64(P^.sequence); //GetPackets whil increment this, DecodePackets - Decrement
if P^.sequence > P^.maxsequence then P^.maxsequence := P^.sequence;
if P^.getPoint < MAX_PACKET_REC then InterLockedIncrement64(P^.getPoint)
else P^.getPoint := 0;
until SIG_TERM;
GetPackets := 1;
end;
Добавлено спустя 5 минут 50 секунд:
В принципе, можете просто подставить 17 вместо константы, не очень красиво, но проверить работу можно
Добавлено спустя 11 минут 8 секунд:
Еще одно, совсем забыл, когда Вы устанавливали пакеты в Debian, то все пакеты установились? Там иногда нужно зависимости вручную ставить.
-
yantux
- постоялец
- Сообщения: 133
- Зарегистрирован: 29.10.2007 15:02:33
- Откуда: Санкт-Петербург
- Контактная информация:
в дебиане libc и vartypes в дебиане не нашёл, закоментил их, константы всё равно не находит.
Добавлено спустя 26 минут 58 секунд:
в win32 lazarus cthreads, libc - не находит, закоментил
socket() - deprecated, SOCK_RAW находит
PF_PACKET, ETH_P_ALL - не находит
Добавлено спустя 26 минут 58 секунд:
в win32 lazarus cthreads, libc - не находит, закоментил
socket() - deprecated, SOCK_RAW находит
PF_PACKET, ETH_P_ALL - не находит
ETH_P_ALL не прописана нигде, - упущение freepascal, а вообще то она должна быть в vartypes.
Пропишите ее у себя:
const
ETH_P_ALL = 3; // $0003;
PF_PACKET находится в fpc/rtl/linux/unxsockh.inc проверьте или есть у Вас данный файл, или пропишите у себя
PF_PACKET = 17;
Проследите внимательно установились ли все пакеты fpc под Debian. Они там очень капризно ставятся. Нужно скачать полностью все пакеты и установить их, при этом следите, установились ли они, если нет, то какой модуль требуется.
В Win32 это не работает.
Пропишите ее у себя:
const
ETH_P_ALL = 3; // $0003;
PF_PACKET находится в fpc/rtl/linux/unxsockh.inc проверьте или есть у Вас данный файл, или пропишите у себя
PF_PACKET = 17;
Проследите внимательно установились ли все пакеты fpc под Debian. Они там очень капризно ставятся. Нужно скачать полностью все пакеты и установить их, при этом следите, установились ли они, если нет, то какой модуль требуется.
В Win32 это не работает.
-
yantux
- постоялец
- Сообщения: 133
- Зарегистрирован: 29.10.2007 15:02:33
- Откуда: Санкт-Петербург
- Контактная информация:
Logo писал(а):
В Win32 это не работает.
Почему?
Добавлено спустя 2 минуты 41 секунду:
Для дебиана free pascal 2.0.0:
PF_PACKET прописан в юните libc
ETH_P_ALL прописан в юните kerneldefs
http://bugs.freepascal.org/view.php?id=12272
Добавлено спустя 1 минуту 58 секунд:
Добавил:
http://bugs.freepascal.org/view.php?id=12272
Summary 0012272: probelm of PF_PACKET, ETH_P_ALL
Description rtl.pdf contain information that PF_PACKET and ETH_P_ALL defined in sockets unit.
Is not true, really PF_PACKET defined in libc unit,
ETH_P_ALL defined in kerneldefs unit.
Добавлено спустя 1 час 10 минут 1 секунду:
В Win32 Lazarus нашёл:
PF_PACKET определён в unxsockh.inc и bsocketh.inc - как подключить эти файлы?
ETH_P_ALL - отсутсвует в лазарусе в принцепе
