UDPRecv Problem

  • Hi,

    Muss mal die Fachleute fragen. Ich sende per UDPSend einen Befehle an einen Server und warte auf Antwort. Leider kommt die Antwort in mehreren Stücke, also Schleife rein und warten. Aber egal wie ich es mache, mir gehen einzelne Stücke verloren.
    Mal das Script:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    $ip = "****"
    $port = "****"

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

    $gui = GUICreate("test", 880, 600, 0, 0)
    $server_log = GUICtrlCreateEdit("", 0, 0, 880, 600, BitOR($WS_VSCROLL, $ES_MULTILINE))

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

    GUISetState(@SW_SHOW)

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

    srecv()

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd

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

    Func srecv()
    $time = 0
    UDPStartup()
    $iSocket = UDPOpen($ip, $port)
    $sHeader = "ÿÿÿÿ dvarlist" & @CRLF & _
    "." & @CRLF & @CRLF
    UDPSend($iSocket, $sHeader)
    GUICtrlSetData($server_log, "")
    Do
    $srecv = UDPRecv($iSocket, 1000)
    If $srecv <> "" Then
    $data = GUICtrlRead($server_log)
    GUICtrlSetData($server_log, "" & $data & @CRLF & "NEUES PAKET" & @CRLF & $srecv)
    $data = GUICtrlRead($server_log)
    EndIf
    $time = $time + 1
    ToolTip("" & $time)
    Until StringInStr($data, "total dvars") Or $time > 50
    $time = 0
    EndFunc ;==>srecv

    [/autoit]

    Wo ist mein Fehler den ich definitiv mache? Ich komm da nicht drauf!

    2 Mal editiert, zuletzt von MrB (12. April 2010 um 20:49)

  • Muss es UDP sein? Wenns geht nim TCP
    ansonsten versuchs mal so:

    [autoit]

    Func srecv()
    $time = 0
    UDPStartup()
    $iSocket = UDPOpen($ip, $port)
    $sHeader = "ÿÿÿÿ dvarlist" & @CRLF & _
    "." & @CRLF & @CRLF
    UDPSend($iSocket, $sHeader)
    GUICtrlSetData($server_log, "")$recv = ""
    Do
    $recv &= UDPRecv($iSocket, 1000)
    $time = $time + 1
    ToolTip("" & $time)
    Until StringInStr($data, "total dvars") Or $time > 50$data = GUICtrlRead($server_log)
    GUICtrlSetData($server_log, "" & $recv & @CRLF & "NEUES PAKET" & @CRLF & $srecv)
    $data = GUICtrlRead($server_log)
    $time = 0
    EndFunc ;==>srecv

    [/autoit]

    [MSIE_newline_end ]

  • oder probiers mal so..
    Pseudocode:

    Do
    $TempData = UDPRecv()
    $Data &= $TempData & " | "
    Sleep(100)
    Until StringInStr($TempData, "Finished") = 1

    Statt dem String 'Finished' wäre es vl besser wenn du einfach !ein! bestimmtes Zeichen sendest, dann kann es nicht passieren, dass der String in 2 Teilen ankommt.
    Und wie mein Vorposter schon gesagt hat, TCP wäre besser, denn das überprüft von selbst, ob ein Packet richtig angekommen ist und ruft es erneut ab, falls es fehlerhaft ist.