TCPSetOnEvent

  • Hey Leute: hab ne frage


    Folgender Code:


    [autoit]

    Global $ip = '10.133.120.36'
    Global $port = '12345'
    Global $mainsocket
    Global $incoming

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

    Opt ('GUIOnEventMode', 1)
    main()
    Exit

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

    Func main()
    TCPStartup()
    $listeningSocket = TCPListen($ip, $port)
    Do
    $mainsocket = TCPAccept($listeningSocket)
    Until $mainsocket <> -1
    TCPRecv($mainsocket, 2048)
    GuiSetOnEvent(-1, 'incoming') ;==> Gibt es hier eine Möglichkeitm, zu sagen, dass er dauerhasft auf RecV empfangen soll? also ähnlich GuiSetOnEvent!
    While Sleep(20)
    WEnd
    EndFunc

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

    Func incoming()
    MsgBox(0,"","InCoMiNg!")
    EndFunc

    [/autoit]


    Und nun meine Frage in Zeile 17...


    Kann mir da jemand helfen...?


    Danke!

    Einmal editiert, zuletzt von Mr_gitarre (15. Juli 2010 um 08:57)

  • ach du sch***e, da seh ich ja mal überhaupt nicht durch... :pinch:


    Trotzdem danke 8)

  • Na ich möchte nicht immer darauf achten, dass es aufgerufen wird sondern es soll IM GANZEN PROGRAMM möglich sein, die ganze zeit etwas über RecV zu empfangen...

    Also einmaliges zuordnen einer funktion, wenn was empfangen wird!


    ... und nichmal mit OnEvent bekomm ich das hin, da OnEvent wohl nur für Gui ist...:(:(:(

  • naja mir ist zwar immer noch unklar wofür, denn eigentlich sollte eine recv funktion im mainloop reichen aber will mal net so sein:
    Also mit den normalen TCP funtkionen wirst du nicht weit kommen, weil die soweit ich weiß nichts wie onevent unterstützen... deshalb downloadest du dir ersteinaml die ASock.au3 dann haste hier nen server (ganz simpel^^):

    [autoit]

    TCPStartup()
    $listen = TCPListen(@IPAddress1, 12345)
    Do
    $clientsocket = TCPAccept($listen)
    Until $clientsocket > -1

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

    Sleep(2500)

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

    TCPSend($clientsocket, "hi")

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

    Sleep(2500)

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

    TCPCloseSocket($clientsocket)
    TCPShutdown()

    [/autoit]

    und hier der client (genügend kommentiert)... der beruht auf dem link von seubo ;)

    [autoit]

    #include <ASock.au3>

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

    Global Const $WM_USER = 1024 ;wird denke ich gebraucht, damit keine funktionen überschrieben werden, kp warum genau :P
    Global $hDummiGui, $hMainSocket

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

    Example( )

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

    Func Example( )
    TCPStartup( ) ;Natürlich tcp starten
    $hDummiGui = GUICreate("") ;Eine DummiGui, sie wird nicht als oberfläche gebraucht, sondern an sie werden Messages geschickt, wenn etwas bei tcp passiert
    $hMainSocket = _ASocket() ;Socket erstellen
    _ASockSelect($hMainSocket, $hDummiGui, $WM_USER + 1, BitOR( $FD_READ, $FD_WRITE, $FD_CONNECT, $FD_CLOSE ) ); Hier die dummigui und die MessageID übergeben
    GUIRegisterMsg($WM_USER +1, "OnSocketEvent" ) ;Hier registrieren wir unsere Message, damit wir sie auch verwerten können, wenn wir eine bekommen
    _ASockConnect($hMainSocket, @IPAddress1, 12345 )
    While 1
    Sleep(1000) ;Restlicher mainloop
    WEnd
    EndFunc

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

    Func OnSocketEvent( $hWnd, $iMsgID, $WParam, $LParam ) ;Die funktion ist stark gekürzt, damit du das wesentliche verstehst... keine fehlerkontrollen drin...
    Local $hSocket = $WParam
    Local $nSocket = $iMsgID - $WM_USER
    Local $iError = _HiWord( $LParam )
    Local $iEvent = _LoWord( $LParam )

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

    Local $sDataBuff
    Local $iSent

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

    If $iMsgID = $WM_USER +1 Then
    Switch $iEvent
    Case $FD_READ ;Wir erhalten Daten
    If $iError = 0 Then
    $sDataBuff = TCPRecv( $hSocket, 1024 ) ;Diese Daten holen wir aus den Buffer
    If $sDataBuff <> "" Then MsgBox(0, "RECV", $sDataBuff, 2) ;und geben sie aus
    EndIf
    Case $FD_WRITE ;Wir senden daten
    ;blubb
    Case $FD_CLOSE ;Verbindung wird geschlossen
    _ASockShutdown( $hSocket ) ;Den ASocket schließen
    Sleep( 1 )
    TCPCloseSocket( $hMainSocket ) ;Dann den Socket
    MsgBox(0, "CLOSE", "Server disconnected!", 2) ;Ne nachricht
    TCPShutdown() ;TCP runterfahren
    Exit ;Beenden
    Case $FD_CONNECT ;Verbindung wird aufgebaut
    MsgBox(0, "CONNECT", "YEEHAA", 2) ;Was soll man da noch sagen :)
    EndSwitch
    EndIf
    EndFunc

    [/autoit]
  • DummiGui zum kommunizieren untereinander der Funktionen, richtig??

    Doch die Zeile 13 versteh ich leider nicht Socket-select??

    die 14.e und die 15.e leider auch nicht...

    ....


    und wofür brauche ich das? ich erstelle einen server, wenn dieser verbindung hat, soll er IMMER daten bekommen, ganz egal, ober er gerade noch was nebenbei macht oder nicht... sonst müsste ich ja sone Funktion ständig mitschleppen, die am Ende der Schleife ausgeführt wird, um etwas empfangen zu können...!
    Vielen dank für eure antworten!!!!!!

  • also^^
    1. ja die gui ist nur zum kommunizeren gedacht :)
    zeile 13: da wird einfach nur ausgewählt, wann das event gecallt werden soll (also bei read, write balba), der erste parameter ist der socket bei dem dsa ganze gemacht werden soll. dann die gui, und dann eine ID die kannste eigentlich immer auf 1025 lassen.. nur wenn ud halt mehrere sockets hast solltest du halt für den ersten 1025 für den zweiten 1026 machen und so weiter ;)
    zeile 14: dazu musst du wissen: gewisse aktionen werden an/von guis gesendet z.b. wenn man sie minimiert usw... mit der registermsg funktion kannst du festlegen, welche funktion aufgerufen werden soll, wenn eine bestimmte nachricht an die gui gesendet wird... in unserem fall die ontcpfunc... mit a sock select haben festgelegt, bei welchen tcp-aktionen eine nachricht gesendet werden soll... und wir haben auch die gui festgelegt, an die sie gesendet werden sollen... also müssen wir bei dieser gui (Dummy-Gui) natürlich auch die registermsg-func benutzten, damit wir auch wirklich mitbekommen wenn was von asocket gesendet wird... denn sonst erhällt halt die gui was, aber wir bekommen davon nix mit :D
    zeile 15: ist eigentlich genausi wie tcpconnect ;)

  • Is ja übel, ich glaub ich hab noch nie so wenig verstanden...

    Ich glaub ich les das morgen nochmal durch!

    Dank dir;)

  • Aber das ist doch eigentlich nur Übertriebener Aufwand. Warum machst du nicht einfach eine Adlibregister Funktion, die alle Clients in ner Schleife durchgeht und Daten empfängt. Das ist doch viel einfacher. Mit TimerInit() und TimerDiff() intelligent platziert kannst du direkt einen Idle-Timer erstellen. Also einen Timer, der deiner AdlibRegister Funktion sagt, OB das Script überhaupt Zeit hätte, alle Daten vom jetzigen Client zu empfangen, oder nur einen kleinen Teil. Du kannst dir da mit ein bisschen logischen Denken eine eigene Funktion schreiben. Vorteil ist, dass du es so besser lernst, und auch nicht mehr vergisst. Das mit den Timern ist natürlich nur eine Anregung gewesen. Aber ich denke, dass es mit AdlibRegister um einiges einfacher umzusetzen wäre.

    Der Vorteil an TCP ist nämlich folgender: TCP arbeitet mit einem Buffer. Das heißt, dass du (frag mich jetzt nicht wieviel) Daten automatisch in den Buffer schreibst, und diese bleiben auch dort, bis du sie mit TCPRecv abholst.