TCPSend und TCPRecv ?

  • Hallo an Alle,

    ich habe ein Button erstellt, der beim klick TCPSend($iSocket, "DATA") macht.
    das ganze läuft nicht mit GuiGetMsg() sondern in Opt("GUIOnEventMode", 1) wie lange man in While schleife den Sleep setzt ist GUIOnEventMode egal... schön und gut :)

    mein Problem:
    wenn ich Button einmal klicke sendet TCPSend, einmal "DATA", TCPRecv empfängt dies und gibt ein MsgBox aus mit dem Text: "DATA2"
    wenn ich mehrere male Button klicke, sendet er die ganze zeit DATADATADATADATA, soll er aber nicht, einmal "DATA" reicht mir aus :(

    wie kann ich nur ein DATA senden und auch so empfangen, trotzt mehrere klicks?

    Gruss,
    Automatisator

  • Die Frage ist, aber wann darf er wieder senden. Starte Bein ersten Klick einfach einen Timer und Frage ihn beim Klick immer ab. Solange wie du für dich halt die Zeit setzt bis er wieder senden darf.

  • Hallo m-obi,

    Zitat

    Die Frage ist, aber wann darf er wieder senden.

    eigentlich dann wenn ich wieder auf Button klicke... ?

    Zitat

    Starte Bein ersten Klick einfach einen Timer und Frage ihn beim Klick immer ab. Solange wie du für dich halt die Zeit setzt bis er wieder senden darf.

    kannst Du mir das bitte mal näher erklären? Du meinst, nach Button klick (TCPSend) ein Sleep(?) machen?


    Gruss,
    Automatisator

  • Was heißt denn mehrere Male den Button drücken? Ich dachte das willst du nicht. Wegen Timer schau dir mal TimerInit und TimerDiff an.

  • Was heißt denn mehrere Male den Button drücken?

    das ist ja, man klickt auf Button mehrere male, und TCPSend macht dann "DATADATADATA" bzw. TCPRecv empfängt dann "DATADATADATA" soll er aber nicht, sondern nur einmal "DATA" empfangen.

    Zitat

    Wegen Timer schau dir mal TimerInit und TimerDiff an.


    das ist ja, ich weiß nicht wie ich das beim Button klick einsetze...? :(

  • Ach jetzt versteh ich. Wenn TCPRecv dasselbe empfängt soll er es nur einmal ausgeben? Also musst du das aktuelle Empfangene mit dem letzten vergleichen.

  • Ach jetzt versteh ich. Wenn TCPRecv dasselbe empfängt soll er es nur einmal ausgeben? Also musst du das aktuelle Empfangene mit dem letzten vergleichen.

    ok, so geht es auch....

    ich habe das jetzt so gemacht: wenn Button geklickt wird macht TCPSend "DATA|DATA|DATA|DATA"
    Client (TCPRecv) empfängt das ganze, zerteilt es StringSplit($recv , "|") und speichert das ganze in davor gesetzte $array

    $array[1] enthält nun einmal "DATA" ....

    kannst Du mir nur ein Beispiel/Tipp geben wie das mit Button und Timer funktioniert?
    Danke Dir...! :)

    Gruss,
    Automatisator

    3 Mal editiert, zuletzt von Automatisator (20. Mai 2012 um 15:09)

  • Wenn du es sauber programmieren willst, mach es mit einem Vergleich. Leider kann ich dir jein Script bieten momentan. Warte noch auf meinen neuen Akku.

  • Wenn du es sauber programmieren willst, mach es mit einem Vergleich.

    also nochmal: TCPSend sendet DATADATADATA...

    die frage ist jetzt, wie ich (beim Client-Script) nur einmal DATA herausfiltere, da gibt es verschiedene alternativen

    1. man nimmt nur die ersten 4 Buchstaben (StringLeft)
    (nicht ausprobiert, es müsste aber funktionieren...)

    2. man sendet 4x DATA mit "|" (seperator), TCPRecv empfängt dies, und speichert es in $array = StringSplit($recv, "|")
    funktioniert alles wunderbar...


    While 1
    Local $recv = 0
    $recv = TCPRecv($iSocket, 1024)
    If @error Then Exit
    If $recv <> "" Then

    Local $split = StringSplit($recv, "|")

    If Not $split[4] Then ContinueLoop

    MsgBox(0, "TCPRecv", "Ausgefiltert: " & $split[4])
    ExitLoop

    EndIf
    Sleep(100)
    WEnd


    Gruss,
    Automatisator

  • also protokolle machen das so:
    Bevor man die wirklichen daten versendet, schickt man nen integer vorraus, welcher die Anzahld er kommenden bytes enthält. also sagen wir so:
    Als 1. schickten wir die zahl 4 und danach DATA

    Der empfänger empfängt die 4, wieß somit das das paket nun aus 4 zeichen ebsteht und liest diese 4 nur ein (TCPREcv, kannst du ja sagen wiviele bytes er lesen soll)
    und nach den 4 bytes weiß er, dass die nachricht fertig ist, und dann erwartet er wieder nen integer, um das nächste paker auszulesen.

    Also Bsp:
    15IchBinEinString5Hallo <-ist in der leitung(andersrum halt, erst zahl dann buchstaben)
    TCP_recv liest integer ein(4byte) wertet den aus und liest dann soviel bytes wie im integer angegeben ist, etc.

  • Aber ich würde den Integer nicht als ASCII senden sonder als Byte. Und davor eine Befehl z.b. 0x00. Dann weiß er, dass es sich um die Größe des nächsten Paketes handelt.

  • also protokolle machen das so:
    Bevor man die wirklichen daten versendet, schickt man nen integer vorraus, welcher die Anzahld er kommenden bytes enthält. also sagen wir so:
    Als 1. schickten wir die zahl 4 und danach DATA

    Der empfänger empfängt die 4, wieß somit das das paket nun aus 4 zeichen ebsteht und liest diese 4 nur ein (TCPREcv, kannst du ja sagen wiviele bytes er lesen soll)
    und nach den 4 bytes weiß er, dass die nachricht fertig ist, und dann erwartet er wieder nen integer, um das nächste paker auszulesen.

    Also Bsp:
    15IchBinEinString5Hallo <-ist in der leitung(andersrum halt, erst zahl dann buchstaben)
    TCP_recv liest integer ein(4byte) wertet den aus und liest dann soviel bytes wie im integer angegeben ist, etc.

    guter Tipp ... Danke...! :)


    Zitat

    Aber ich würde den Integer nicht als ASCII senden sonder als Byte. Und davor eine Befehl z.b. 0x00. Dann weiß er, dass es sich um die Größe des nächsten Paketes handelt.

    ok, das mit, nicht als ASCII, sondern als Byte verstehe ich, aber das: "Und davor eine Befehl z.b. 0x00.
    Dann weiß er ..." ist mir unklar?

  • Sonst würde er die byteangabe in ASCII umwandeln und ein Zeichen interpretieren. Das 0x00 sagt ihm, das ist die Größe des Pakets.

  • Sonst würde er die byteangabe in ASCII umwandeln und ein Zeichen interpretieren. Das 0x00 sagt ihm, das ist die Größe des Pakets.

    also, ich weiß leider immer noch nicht wie man das einstellt :(

    1. nicht ASCII sondern Byte
    ich verstehe das so; statt TCPSend($Socket, ???, 1) = Binärdaten versenden
    da wo drei Fragezeichen ist, kommt dann 0x00,oder?
    wie empfange ich die richtige Bytes nun? (so das wirklich kein Byte verloren/abgeschnitten ist...)
    TCPRecv ist in While schleife, also:

    While 1
    $recv = ""
    $recv &= TCPRecv($Socket, 1024)
    ; man kann es nun so machen
    If StringInString($recv, "DATA") Then ....
    ; andere Alternative, man sendet statt einmal "DATA" mehrere DATA (TCPSend($Socket, "DATA|DATA|DATA|DATA" )
    If $recv <> "" Then
    $split = StringSplit($recv, "|")
    _ArrayDisplay($split)
    EndIf
    WEnd

    @m-obi 
    man findet nirgends eine Beschreibung wie man das mit 0x00 macht... :( Hoffe Du zeigst es uns....?

    LG,
    Automatisator

  • Ich würde es so machen:

    [autoit]

    TCPSend($iSocket, Chr(0) & Chr(1) & Chr($iSizePacket))

    [/autoit]


    0 und 1 heißt dann das die Größe danach folgt. D.h. wenn du ein Packet bekommst suchst du zuerst nach den beiden Zeichen.