suche Beispielcode für pcap Anwendung

Alle Fragen zur Netzwerkkommunikation
Antworten
Cocky
Beiträge: 46
Registriert: Sa 15. Nov 2008, 13:17

suche Beispielcode für pcap Anwendung

Beitrag von Cocky »

Frohes Fest euch allen ! :)

ich will für XP(32) derzeit einen speziellen kleinen Netzwerkmonitor schreiben, bei dem angezeigt wird von/zu welcher MAC/IP wieviel traffic produziert wird. Ggf. auch noch welche Protokolle dafür herangezogen wird. FPC hat dafür das pcap Packet integriert, welches auf WinPCap (wpcap.dll) bzw. libpcap aufsetzt.

Leider habe ich für den Einbau dieser Funktionen in FPC/Lazarus keinerlei Doku oder Beispielcode gefunden. Ich habe mir die pcap.pp angesehen und weiß daher, welche Funktionen prinzipiell anwendbar sind. Allerdings hab ich noch nie mit externen dll's gearbeitet und hab mit Adressarithmetik unter FPC auch geringfügige Probleme. Daher leichte Startschwierigkeiten. :oops:

Daher meine Frage:
Hat zufällig jemand einen funktionierenden Beispielscode zur pcap Anwendung für mich ? oder würde sich ein Herz fassen und mir ein Codeschnipselchen dazu schenken ? Die Anwendung der Funktion zum Anzeigen der devices (s.u.) würde mir evtl. als Starthilfe schon reichen. *bettel*

Code: Alles auswählen

....
{ Auszug aus der pcap.pp }
{
   * Item in a list of interfaces.
    }
  { name to hand to "pcap_open_live()"  }
  { textual description of interface, or NULL  }
  { PCAP_IF_ interface flags  }
     PPPcap_If = ^PPcap_If;
     PPcap_If = ^TPcap_If;
     TPcap_If = record
       next : PPcap_If;
       name : PChar;
       description : PChar;
       addresses : PPcap_Addr;
       flags : DWord;
     end; 
 
....
 
function pcap_findalldevs(para1:PPPcap_If; para2:PChar): Longint; cdecl; external PCAP_LIB_NAME;
Noch mal ein gesegnetes Fest euch allen !

Lieben Gruß Cocky

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: suche Beispielcode für pcap Anwendung

Beitrag von theo »

Ich verstehe die Frage nicht ganz und auch nicht, was der Code-Schnippsel mit der Frage zu tun hat.
Ich würde mal nach Anleitungen in C suchen und diese auf Pascal übersetzen. Die Logik ist ja gleich.
z.B. http://www.tcpdump.org/pcap.html" onclick="window.open(this.href);return false;

Cocky
Beiträge: 46
Registriert: Sa 15. Nov 2008, 13:17

Re: suche Beispielcode für pcap Anwendung

Beitrag von Cocky »

theo hat geschrieben:Ich verstehe die Frage nicht ganz und auch nicht, was der Code-Schnippsel mit der Frage zu tun hat.
Ich würde mal nach Anleitungen in C suchen und diese auf Pascal übersetzen. Die Logik ist ja gleich.
z.B. http://www.tcpdump.org/pcap.html" onclick="window.open(this.href);return false;
Erst mal vielen Dank für die Antwort, theo !

Ich verstehe nicht, was Du an meiner Frage nicht verstehst ? :shock:

Es geht mir wie ich schon sagte darum, WIE man die Funktionen in FPC/Lazarus einbaut. NICHT darum, wie pcap bzw. WinPCap als solches funktioniert. Das Tutorial zu WinPCap habe ich mir durchgelesen und die prinzipielle Anwendung ist mir im wesentlichen transparent. Aber wie gesagt nicht, wie man die Funktionen der wpcap.dll bzw. deren Parameter korrekt via Lazarus anspricht und auswertet. Durch ein kleines Beispiel bzw. -Codeschnipsel erhoffe ich mir Aufschluß hierüber.

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: suche Beispielcode für pcap Anwendung

Beitrag von theo »

Ich verstehe an deiner Frage nicht was du genau wissen willst.
Ein Code Schnippsel habe ich nicht.
Also müsstest du konkreter fragen, damit jemand die Frage evtl. beantworten kann.
Mit welchem Parameter hast du Probleme?

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: suche Beispielcode für pcap Anwendung

Beitrag von Socke »

Du kannst die Bibliothek verwenden, in dem du die Unit pcap in den Uses-Abschnitt aufnimmst. Dann sind alle Funktionen aus der Bibliothek direkt verfügbar. Beispiel:

Code: Alles auswählen

uses pcap, sysutils, und, weitere;
// ...
var
  iface: PPcap_If;
begin
  if pcap_findalldevs(@iface, 'ein String') = 0 then // ein Schuss ins Blaue; ich kenne die Funktion überhaupt nicht
    ShowMessage('Ergebnis: 0')
  else
    exit;
    // anderer Code
end;
Wie du die Funktionen verwendest, musst du entsprechender Dokumentation entnehmen. Deine Leistung auf Pascal bezogen beschränkt sich primär darauf, die richtigen Datentypen (PChar) auswählen.
Zuletzt geändert von Socke am So 26. Dez 2010, 14:43, insgesamt 1-mal geändert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Cocky
Beiträge: 46
Registriert: Sa 15. Nov 2008, 13:17

Re: suche Beispielcode für pcap Anwendung

Beitrag von Cocky »

vielen Dank Socke !! :)

jo, so etwas in der Art brauch ich. Was mich halt sehr verwirrt ist ... Die Funktion "pcap_findalldevs" wäre u.a. mit dem Parameter vom Typ "PPPcap_If" aufzurufen. Wobei PPPcap_If ein Pointer auf PPcap_If und dieser wiederum ein Pointer auf TPcap_If ist, welches ein record ist der u.a. ein Feld namens "adresses" enthält, was entweder die Adresse des nächsten devicerecords oder NILL enthält. *umkipp* :|

Müsste ich wirklich vom Typ PPcap_If deklarieren oder PPPcap_If ?

Wie auch immer, ich werds nachher mal so probieren (muß gleich zum Familientreffen).

Und danke nochmal !!

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: suche Beispielcode für pcap Anwendung

Beitrag von Socke »

Der Typ TPcap_If ist eine Einfach-verkettete-Liste (Feld: next;). Wenn du nicht, weißt, was das ist, bitte nachlesen. Spätestens hier musst du auch ohne Probleme mit Zeigern, Adressen und den dazugehörigen Operatoren umgehen können. Vielleicht schaust du dir zunächst ein Beispiel zu dieser Thematik an.
Records werden unter C meistens nicht direkt weitergegeben. Es wird nur ein Zeiger darauf ausgetauscht; das wäre hier PPcap_If.
Damit eine Funktion einen Wert zurückliefern kann (außer/zusätzlich zum Rückgabewert) muss ein Zeiger auf einen Speicherbereich für diesen Wert übergeben werden, in den dieser Wert hineingeschrieben werden kann. Damit die Funktion pcap_findalldevs() dir also einen Zeiger auf das erste Element dieser Liste geben kann, braucht sie einen Speicherplatz (Variable) vom Typ PPcap_If. Die Adresse davon kann man in einem Zeiger auf diesen Typ, also in PPPcap_If speichern.

Ich habe mich mal an die Dokumentation unter http://www.winpcap.org/docs/docs_40_2/h ... pfunc.html gehalten.
Der Funktion müssen wir dann also die Adresse von einem PPcap_If im ersten Parameter mitteilen. Im zweiten Parameter kommt ein leerer String der Länge PCAP_ERRBUF_SIZE.

Code: Alles auswählen

var
  iface: PPcap_If;
  errstr: String;
begin
  SetLength(errstr, PCAP_ERRBUF_SIZE);
  if pcap_findalldevs(@iface, PChar(errstr)) = 0 then
  begin
    // Erfolg
    iface^.Next.Next; // ist das dritte Element in der Liste
  end
  else
    ShowMessage(errstr);
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Cocky
Beiträge: 46
Registriert: Sa 15. Nov 2008, 13:17

Re: suche Beispielcode für pcap Anwendung

Beitrag von Cocky »

Danke, das hilft mir auf jeden Fall erst mal weiter. Zumindest habe ich jetzt einen guten Ansatzpunkt. Ich werde Deinem Rat folgen und mich noch mal eingehend mit der ganzen Zeigerthematik auseinandersetzen, damit ich wirklich verstehe was ich mache. Wenn ich etwas brauchbares zusammengeschustert habe oder auf weitere Probleme stoße, meld ich mich hier nochmal.

[EDIT]
Das Einlesen der devices hab ich mittlerweile (dank eurer Hilfe (special thanks @ socke) !!) hinbekommen:

Code: Alles auswählen

//******************************************************//
//*  Button1                                           *//
//******************************************************//
 
procedure TForm1.Button1Click(Sender : TObject);
 
var
 
iface:  PPcap_If;
errstr: String;
 
begin
 
SetLength(errstr, PCAP_ERRBUF_SIZE);
 
if pcap_findalldevs(@iface, PChar(errstr)) = 0 then
  begin
 
    while iface <> NIL do
       begin
       Memo1.Lines.Add(string(iface^.name));
       Memo1.Lines.Add(string(iface^.description));
       iface := iface^.next;
       end;
    pcap_freealldevs(iface);
  end
else
    ShowMessage(errstr);
end;
Nichts anderes als ein Button und ein TMemo auf dem die Namen und Beschreibungen aller devices ausgegeben werden.

Mein nächstes Etappenziel ist nun eine recyclebare Unit zu basteln. Ich werd sie dann hier posten.
[/EDIT]

Antworten