www.mikrocontroller.net

Forum: PC-Programmierung pcap_next() wartet endlos, wie mit pcap_breakloop() unterbrechen?


Autor: LibPcap (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin einwenig am Basteln mit der LibPcap Library um Netzwerkpakete zu 
versenden und zu empfangen. Wie in der Dokumentation beschrieben wartet 
in pcap_next() das Programm endlos auf ein nicht ankommendes Paket, 
obwohl beim Öffnen des Adapters eine Wartezeit von 100ms angegeben 
wurde. Der Text aus der Dokumentation lautet:


Note that pcap_next() will, on some platforms, loop reading packets from 
the OS; that loop will not necessarily be terminated by a signal, so 
pcap_breakloop() should be used to terminate packet processing even if 
pcap_next() is being used.


OK, das scheint normal zu sein und es gibt eine Funktion die das Problem 
lösen sollte.
Da das aktuelle Programm aber in einer Endlosschleife irgend wo in 
pcap_next hängt kann ich nicht aus dem aktuellen Programm heraus 
beenden. Einen neuen Thread starten? Scheint laut Dokumentation auch 
nicht zu gehen (abgesehen davon weiss ich auch nicht wie man das in ANSI 
C umsetzen könnte):


Note also that, in a multi-threaded application, if one thread is 
blocked in pcap_dispatch(), pcap_loop(), pcap_next(), or pcap_next_ex(), 
a call to pcap_breakloop() in a different thread will not unblock that 
thread; you will need to use whatever mechanism the OS provides for 
breaking a thread out of blocking calls in order to unblock the thread, 
such as thread cancellation in systems that support POSIX threads.


Das wirft bei mir mehr Fragen auf als Lösungen. Hat da jemand Erfahrung 
damit? Es kann a nicht sein, dass ich weil kein Paket angekommen ist das 
ganze Programm beenden muss...
Wenn also jemand das gleiche Problem und eine Lösung dazu hat, oder in 
einem anderen Kontext ein ähnliches Problem hatte: her mit den Tipps ;)

Grüsse

Autor: LibPcap (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich hab noch mal ein bisschen über der Sache gebrütet:
Mit signal(bla1, bla2) kann man ja zum Beispiel auf die Eingabe CTRL + 
C reagieren. Es wird dann die Funktion bla2 aufgerufen. Dort kann dann 
etwas damit gemacht werden. Dort könnte ich nun die oben beschriebene 
Funktion pcap_breakloop() aufrufen.
Nun möchte ich aber, dass die Funktion bla2 nicht durch die 
Tastenkombination CTRL + C aufgerufen wird, sondern nach einer 
bestimmten Zeit.

Ist dies auch möglich? Ich hoffe dass da jemand eine Antwort weiss...

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit "alarm(x)" kannst du nach X Sekunden ein Signal (SIGALRM) auslösen 
lassen...

Autor: LibPcap (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das habe ich inzwischen auch gesehen, aber gibt es auch die 
Möglichkeit einen SIGALARM unter einer Sekunde auszulösen? Z.B. 100 ms? 
Es muss nicht auf die Millisekunde genau sein, aber 1 Sekunde ist 
definitiv zu lange...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.