winpcap Dispatch/Loop

    • Offizieller Beitrag

    Hallo an alle,

    Ich benutzte gerade diese UDF um eine Art WireShark aufzubauen (dafür da, um die Kommunikation von Client und Server auf Fehlern zu überprüfen).
    http://opensource.grisambre.net/pcapau3/

    Dies klappt soweit auch ganz gut, leider bekomme ich es nicht mit CallBack hin. Mit _PcapDispatchToFunc bekomme ich einfach keine Packete zurück und mit einer Funktion die ich im Internet gefunden habe (_PcapLoopToFunc) reagiert mein Programm gar nicht mehr, er zeigt zwar die Pakete an, aber dafür reagiert das restliche Script nicht.

    Über Anregungen und Hilfen wäre ich sehr dankbar, da ich mich mit WinPCAP leider nur sporadisch auskenne. :)

    Spoiler anzeigen
    [autoit]

    #include <Winpcap.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Reagiert nicht bei Loop")
    GUICtrlCreateLabel("Reagiert nicht bei Loop, bei Dispatch tut das Script gar nichts.",0,0,400,400)
    GUICtrlSetFont(-1,16)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $winpcap = _PcapSetup()
    $pcap_devices = _PcapGetDeviceList()
    $pcap = _PcapStartCapture($pcap_devices[0][0], '')
    $int = _PcapLoopToFunc($pcap, "PacketeAnzeigen");<-- führt zu nicht reagieren der GUI
    ;~ $int = _PcapDispatchToFunc($pcap, "PacketeAnzeigen");<-- tut nichts

    [/autoit] [autoit][/autoit] [autoit]

    OnAutoItExitRegister("onautexit")

    [/autoit] [autoit][/autoit] [autoit]

    Func PacketeAnzeigen($packet)
    ConsoleWrite(Hex($packet[3]) & ",")
    EndFunc ;==>PacketeAnzeigen

    [/autoit] [autoit][/autoit] [autoit]

    While GUIGetMsg() <> -3
    Sleep(100)
    ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&"."&@MSEC& @LF);<-- wird nicht angezeigt
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func onautexit()
    _Pcap_breakloop($pcap)
    _PcapStopCapture($pcap)
    Exit
    EndFunc ;==>onautexit

    [/autoit] [autoit][/autoit] [autoit]

    Func _PcapLoopToFunc($pcap,$func) ;(ist die _PcapDispatchToFunc funktion nur abgeändert)
    If NOT IsPtr($pcap) Then return -1
    Local $CallBack = DLLCallbackRegister ("_PcapHandler", "none:cdecl", "str;ptr;ptr")
    If $CallBack=0 Then return -1
    Local $r=DllCall($Pcap_dll, "int:cdecl", "pcap_loop", "ptr", $pcap, "int",-1, "ptr", DllCallbackGetPtr($CallBack), "str", $func)
    if @error then return -1
    DllCallbackFree ( $CallBack )
    return $r[0]
    EndFunc
    Func _Pcap_breakloop($pcap)
    DllCall($Pcap_dll, "none:cdecl", "pcap_breakloop", "ptr", $pcap)
    EndFunc

    [/autoit]

    Gruß,
    Spider

  • Einen Fehler sehe ich auch nicht, aber wäre es nicht fast einfacher wenn du mit _PcapGetPacket arbeitest. Das funktioniert doch oder?

    Gruss Shadowigor

  • Da hast du Glück, bei mir zeigt er noch nicht mal die Pakete an^^ Dein Programm hängt sich auf, weil pcap_loop cnt Pakete empfängt.

    Code
    int pcap_loop 	( 	pcap_t *  	p,
    		int  	cnt,
    		pcap_handler  	callback,
    		u_char *  	user	 
    	)

    Du gibst bei cnt -1 ein, was soviel beudeutet wie unendlich Pakete empfangen. Der Mainthread führt nun den Code in der wpcap.dll aus und die dortige Endlosschleife verhindert die Auswertung der Fensternarichten. Bei mit funktioniert dein Code leider gar nicht, aber vielleicht macht es für dich Sinn beim 2. Parameter der Dll den Parameter 1 zu übergeben. Sinn machen tut es aber eigentlich sowieso nicht, weil du auch einfach _PcapGetPacket verwenden kannst :D Ausserdem würde pcap_loop auch bei cnt = 1 zu Minilaggs führen, da zwischen manchen Paketen schon eine Sekunden vergehen kann.

    • Offizieller Beitrag

    Da hast du Glück, bei mir zeigt er noch nicht mal die Pakete an^^ Dein Programm hängt sich auf, weil pcap_loop cnt Pakete empfängt.

    Code
    int pcap_loop 	( 	pcap_t *  	p,
    		int  	cnt,
    		pcap_handler  	callback,
    		u_char *  	user	 
    	)

    Du gibst bei cnt -1 ein, was soviel beudeutet wie unendlich Pakete empfangen. Der Mainthread führt nun den Code in der wpcap.dll aus und die dortige Endlosschleife verhindert die Auswertung der Fensternarichten. Bei mit funktioniert dein Code leider gar nicht, aber vielleicht macht es für dich Sinn beim 2. Parameter der Dll den Parameter 1 zu übergeben. Sinn machen tut es aber eigentlich sowieso nicht, weil du auch einfach _PcapGetPacket verwenden kannst :D Ausserdem würde pcap_loop auch bei cnt = 1 zu Minilaggs führen, da zwischen manchen Paketen schon eine Sekunden vergehen kann.


    Hey,

    Ja, aber das bringt mir ja auch nichts. Das wird wohl auch der Unterschied zwischen loop und dispatch sein. Bei Loop bleibt die DLL intern in einer Schleife, bei Dispatch gibts ein OnEvent.
    Natürlich geht das auch einfach mit GetPacket, ich fände es aber eigentlich OnEvent schöner.
    Naja, dann hab ich wohl keine andere Wahl, trotzdem danke euch beiden ;)

    Gruß,
    Spider