probleme mit UDPRecv

  • Ich habe mir ein kleinen gameserverbrowser gebastelt. Nun hab ich aber probleme mit UDPRecv, bei manchen servern funktioniert es und bei manchen nicht. ABER bei den servern bei denen es nicht funktioniert kann ich mit Wireshark nachweisen das die entsprechende antwort (serverstatus etc.) empfangen wurde, aber wieso liest autoit diese nicht ???
    (in dem script sind 2 beispiel ip's und ports, die eine funktioniert, die andere nicht)


    [autoit]

    #include <String.au3>
    #include <array.au3>
    Dim $A2S_SERVERQUERY_GETDATA = _HexToString('5c7374617475735c00')
    Dim $getdata

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

    $s_ip = '81.19.219.217' ; bei dem server funktioniert es
    $s_port = "27888" ; bei dem server funktioniert es

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

    ;~ $s_ip = "69.125.2.214" ; bei dem server funktioniert es nicht
    ;~ $s_port = "27890" ; bei dem server funktioniert es nicht

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

    UDPStartup()
    $socket = UDPOpen($s_ip,$s_port)
    UDPSend($socket,$A2S_SERVERQUERY_GETDATA)
    $getdata = UDPRecv($socket,999999)
    $getdata = BinaryToString($getdata)
    ConsoleWrite(@CRLF & $getdata & @CRLF)
    UDPCloseSocket($socket)
    UDPShutdown()

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

    $ahostname = _StringBetween($getdata,'\hostname\','\')
    $hostname = _ArrayToString($ahostname)
    MsgBox(0,'Server Name',$hostname)

    [/autoit]

    Einmal editiert, zuletzt von hofi02 (14. Oktober 2008 um 15:43)

  • Du solltest UDPRecv in eine Schleife setzen, ich vermute das die Server die nicht funktionieren einfach so schnell antworten das dein Script überhaupt nicht die möglichkeit hat zu reagieren. Am besten benutzt du in der Schleife auch noch Timer falls ein Server mal tatsächlich nicht antwortet.

    Folgendes ist ein grober Anfang, aber wie oben schon gesagt empfehle ich dir eine Timeoutfunktion einzubauen

    [autoit]

    While 1
    $data = UDPRecv($socket, 50)
    If $data <> "" Then
    MsgBox(0, "UDP DATA", $data, 1)
    EndIf
    sleep(100)
    WEnd

    [/autoit]
  • Musst mehr zulassen :) 50 bei UdpRecv sind zu wenig.

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <array.au3>
    Dim $A2S_SERVERQUERY_GETDATA = _HexToString('5c7374617475735c00')
    Dim $getdata

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

    $s_ip = '81.19.219.217' ; bei dem server funktioniert es
    $s_port = "27888" ; bei dem server funktioniert es

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

    ;~ $s_ip = "69.125.2.214" ; bei dem server funktioniert es nicht
    ;~ $s_port = "27890" ; bei dem server funktioniert es nicht

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

    UDPStartup()
    $socket = UDPOpen($s_ip,$s_port)
    UDPSend($socket,$A2S_SERVERQUERY_GETDATA)
    While 1
    $getdata = UDPRecv($socket, 2048)
    If $getdata <> "" Then
    MsgBox(0, "UDP DATA", $getdata)
    ExitLoop
    EndIf
    sleep(100)
    WEnd
    ConsoleWrite(@CRLF & $getdata & @CRLF)
    UDPCloseSocket($socket)
    UDPShutdown()

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

    $ahostname = _StringBetween($getdata,'\hostname\','\')
    $hostname = _ArrayToString($ahostname)
    MsgBox(0,'Server Name',$hostname)

    [/autoit]