free pascal unit sockets - не находит PF_PACKET, хотя в rtl.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

free pascal unit sockets - не находит PF_PACKET, хотя в rtl.

Сообщение yantux » 30.09.2008 15:14:05

Делаю работу с сокетами в 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.
yantux
постоялец
 
Сообщения: 133
Зарегистрирован: 29.10.2007 16:02:33
Откуда: Санкт-Петербург

Re: free pascal unit sockets - не находит PF_PACKET, хотя в rtl.

Сообщение Logo » 01.10.2008 00:54:11

PF_PACKET прописана в ~/fpc/rtl/linux/unxsockh.inc, который вложен в unit Sockets. Достаточно в uses вписать Sockets и все находится. Возможно нужно прописать путь к *.inc файлу, но у меня он не прописан. Под Windows реализации нет, по крайней мере я ее не знаю :(
Для примера даю свой рабоающий код для 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, то все пакеты установились? Там иногда нужно зависимости вручную ставить.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: free pascal unit sockets - не находит PF_PACKET, хотя в rtl.

Сообщение yantux » 01.10.2008 10:20:03

в дебиане libc и vartypes в дебиане не нашёл, закоментил их, константы всё равно не находит.

Добавлено спустя 26 минут 58 секунд:
в win32 lazarus cthreads, libc - не находит, закоментил
socket() - deprecated, SOCK_RAW находит
PF_PACKET, ETH_P_ALL - не находит
yantux
постоялец
 
Сообщения: 133
Зарегистрирован: 29.10.2007 16:02:33
Откуда: Санкт-Петербург

Re: free pascal unit sockets - не находит PF_PACKET, хотя в rtl.

Сообщение Logo » 01.10.2008 13:21:36

ETH_P_ALL не прописана нигде, - упущение freepascal, а вообще то она должна быть в vartypes.
Пропишите ее у себя:
const
ETH_P_ALL = 3; // $0003;

PF_PACKET находится в fpc/rtl/linux/unxsockh.inc проверьте или есть у Вас данный файл, или пропишите у себя
PF_PACKET = 17;

Проследите внимательно установились ли все пакеты fpc под Debian. Они там очень капризно ставятся. Нужно скачать полностью все пакеты и установить их, при этом следите, установились ли они, если нет, то какой модуль требуется.

В Win32 это не работает.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: free pascal unit sockets - не находит PF_PACKET, хотя в rtl.

Сообщение yantux » 01.10.2008 13:42:34

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 - отсутсвует в лазарусе в принцепе
yantux
постоялец
 
Сообщения: 133
Зарегистрирован: 29.10.2007 16:02:33
Откуда: Санкт-Петербург


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru