Script Problem.

  • Tag zusammen,
    ich benötige ein Script was die Server Informationen von einem GTA-SA:MP Server ausgibt. Also Player anzahl Ping etc....
    Hier mal das Original Programm:

    [Blockierte Grafik: http://img4.fotos-hochladen.net/uploads/unbenanntagvq3kw06i.jpg]


    Ich habe schonmal versucht eine Grundlage zu machen, nur das klappt nicht richtig =(

    [autoit]


    $Paket="ÿÿÿÿ getstatus" & @CRLF & _
    "." & @CRLF & @CRLF

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

    UDPStartup()
    $Socket=UDPOpen("84.200.21.40", 9142)
    UDPSend($Socket, $Paket)
    Do
    $Recv=UDPRecv($Socket, 2048)
    Until $Recv<>""
    ConsoleWrite($Recv)
    MsgBox(0,"",$Recv)
    UDPCloseSocket($Socket)
    UDPShutdown()

    [/autoit]

    Liebe Grüße
    derBrot

  • was genau meinst du mit protokoll ? :o


    Wie (auf welche Art und Weise, worüber - sprich TCP, UDP etc.) die Daten abgerufen werden. ;)

    Das entsprechende Source-Code Snippet aus der 'samp.exe' wäre hilfreich (falls das Projekt Open-Source ist).

    Mfg

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Ob es open source ist weiß ich nicht , das müsste hier stehen https://autoit.de/www.sa-mp.com dort kann man sich auch diese Modifikation für das Spiel Grand Theft Auto San Andreas herunterladen.

  • Hi,

    ein kleiner Tipp: SA:MP läuft über TCP, nicht UDP :)


    Hab ich mir schon gedacht - UDP verliert ja gerne mal Daten ... :whistling:

    @TE: Probiers halt mal mit TCP.

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Wenn ich das Script so umschreibe passiert immer noch nichts =((

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

    $Paket="hostinfo" & Chr(10)

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

    TCPStartup()
    $Socket=TCPConnect("84.200.21.40", 9142)
    TCPSend($Socket, $Paket)
    Do
    $Recv=TCPRecv($Socket, 2048)
    Until $Recv<>""
    ConsoleWrite($Recv)
    MsgBox(0,"",$Recv)
    TCPCloseSocket($Socket)
    TCPShutdown()

    [/autoit]
  • Hab dir hier mal was gebastelt, kanns nur nicht testen, ob das so richtig ist für den server.

    Spoiler anzeigen
    [autoit]


    $ip ="194.168.2.1";
    $port=7777;
    $type="i";

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

    ;Aufbau
    ; 0 1 2 3 4 5 6 7 8 9 10
    ;| S | A | M | P | IP.1 | IP.2 | IP.3 | IP.4 | Port1 | Port2 | OpCode |

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

    UDPStartup()

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

    $msg = getBinary($type,$ip,$port);Hole binäre nachricht
    ConsoleWrite("Message: "&$msg&@CRLF);

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

    $udp = UDPOPEN($ip,$port);Verbinde mit Server
    ConsoleWrite("UDPOpen: "&$udp[0]&" - Error: "&@error&@CRLF)

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

    $send = UDPSend($udp,$msg); sende Nachricht
    ConsoleWrite("UDPSend: "&$send&" Bytes gesendet - Error: "&@error&@CRLF)

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

    ConsoleWrite("Warte auf Antwort")
    ;Warte auf Antwort
    Local $data;
    While 1
    ConsoleWrite(".");
    $data = UDPRecv($udp, 1024)
    If $data <> "" Then
    ExitLoop
    EndIf
    Sleep(1000)
    WEnd
    ConsoleWrite(@CRLF&" Received: "&$data)

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

    ;alles wieder schließen
    UDPCloseSocket($udp)
    UDPShutdown()

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

    Func getBinary($opCode, $ip, $port)
    Local $_ip = StringSplit($ip,".");

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

    If($_ip[0] <4)Then
    exit(0)
    EndIf

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

    Local $msg = DllStructCreate("align 1;char samp[4];char ip[4];char port[2];char opcode")

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

    DllStructSetData($msg, "samp", "SAMP");

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

    DllStructSetData($msg, "ip", Chr($_ip[1]),1);
    DllStructSetData($msg, "ip", Chr($_ip[2]),2);
    DllStructSetData($msg, "ip", Chr($_ip[3]),3);
    DllStructSetData($msg, "ip", Chr($_ip[4]),4);

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

    DllStructSetData($msg, "port", $port,1);
    DllStructSetData($msg, "port", BitShift($port,8),2);

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

    DllStructSetData($msg, "opcode", $opCode);

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

    Return DllStructGetData(DllStructCreate("align 1;byte[" & DllStructGetSize($msg) & "]", DllStructGetPtr($msg)), 1)
    EndFunc

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

    €dit: kanns ja doch testen, hast ja ip und port angegeben :D funktioniert soweit, nur das einlesesn brauchst halt dann noch..
    €dit2: hier so kommt die Ausgabe auf der Konsole:

    Spoiler anzeigen
    [autoit]


    $ip ="84.200.21.40";
    $port=9142;
    $type="i";
    $debug = 0
    ;Aufbau
    ; 0 1 2 3 4 5 6 7 8 9 10
    ;| S | A | M | P | IP.1 | IP.2 | IP.3 | IP.4 | Port1 | Port2 | OpCode |

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

    UDPStartup()

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

    $msg = getBinary($type,$ip,$port);Hole binäre nachricht
    if($debug==1) Then ConsoleWrite("Message: "&$msg&@CRLF)

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

    $udp = UDPOPEN($ip,$port);Verbinde mit Server
    if($debug==1) Then ConsoleWrite("UDPOpen: "&$udp[0]&" - Error: "&@error&@CRLF)

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

    $send = UDPSend($udp,$msg); sende Nachricht
    if($debug==1) Then ConsoleWrite("UDPSend: "&$send&" Bytes gesendet - Error: "&@error&@CRLF)

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

    if($debug==1) Then ConsoleWrite("Warte auf Antwort")
    ;Warte auf Antwort
    Local $data;
    While 1
    if($debug==1) Then ConsoleWrite(".");
    $data = UDPRecv($udp, 1024,1)
    If $data <> "" Then
    ExitLoop
    EndIf
    Sleep(1000)
    WEnd
    if($debug==1) Then ConsoleWrite(@CRLF&" Received: "&$data&@CRLF&@CRLF)

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

    read($data)

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

    ;alles wieder schließen
    UDPCloseSocket($udp)
    UDPShutdown()

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

    Func read($msg)
    Local $structure = "align 1;byte header[11];byte pass;byte players[2];byte maxPlayer[2];int lengthH;"

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

    Local $struct = DllStructCreate($structure)
    $a = DllStructCreate("align 1;byte[" & DllStructGetSize($struct) & "];", DllStructGetPtr($struct))
    DllStructSetData($a, 1, $msg)

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

    $structure &= "char hostname["&DllStructGetData($struct,"lengthH")&"];int lengthG;"
    $struct = 0;Struct freigeben

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

    $struct = DllStructCreate($structure)
    $a = DllStructCreate("align 1;byte[" & DllStructGetSize($struct) & "];", DllStructGetPtr($struct))
    DllStructSetData($a, 1, $msg)

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

    $structure &= "char gameMode["&DllStructGetData($struct,"lengthG")&"];int lengthMapName;"
    $struct = 0;Struct freigeben

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

    $struct = DllStructCreate($structure)
    $a = DllStructCreate("align 1;byte[" & DllStructGetSize($struct) & "];", DllStructGetPtr($struct))
    DllStructSetData($a, 1, $msg)

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

    $structure &= "char mapName["&DllStructGetData($struct,"lengthG")&"];"
    $struct = 0;Struct freigeben

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

    $struct = DllStructCreate($structure)
    $a = DllStructCreate("align 1;byte[" & DllStructGetSize($struct) & "];", DllStructGetPtr($struct))
    DllStructSetData($a, 1, $msg)

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

    Local $serverInfo = "ServerInfo:"&@CRLF
    $players = DllStructGetData($struct,"players",1);
    $maxPlayers = DllStructGetData($struct,"maxPlayer",1);

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

    $hostname = DllStructGetData($struct,"hostname");
    $gameMode = DllStructGetData($struct,"gameMode");
    $mapName = DllStructGetData($struct,"mapName");
    $struct = 0;Struct freigeben

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

    $serverInfo &= "Hostname: "&$hostname &@CRLF
    $serverInfo &= "Spieler: "&$players&"/"&$maxPlayers&@CRLF
    $serverInfo &= "MapName: "&$mapName&@CRLF
    $serverInfo &= "GameMode: "&$gameMode&@CRLF

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

    ConsoleWrite($serverInfo)

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

    EndFunc

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

    Func getBinary($opCode, $ip, $port)
    Local $_ip = StringSplit($ip,".");

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

    If($_ip[0] <4)Then
    exit(0)
    EndIf

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

    Local $msg = DllStructCreate("align 1;char samp[4];char ip[4];char port[2];char opcode")

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

    DllStructSetData($msg, "samp", "SAMP");

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

    DllStructSetData($msg, "ip", Chr($_ip[1]),1);
    DllStructSetData($msg, "ip", Chr($_ip[2]),2);
    DllStructSetData($msg, "ip", Chr($_ip[3]),3);
    DllStructSetData($msg, "ip", Chr($_ip[4]),4);

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

    DllStructSetData($msg, "port", $port,1);
    DllStructSetData($msg, "port", BitShift($port,8),2);

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

    DllStructSetData($msg, "opcode", $opCode);

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

    Return DllStructGetData(DllStructCreate("align 1;byte[" & DllStructGetSize($msg) & "]", DllStructGetPtr($msg)), 1)
    EndFunc

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


    Das ist zwar nicht schön gemacht aber gibt dir vll ne Idee wie man das machen kann :)

    3 Mal editiert, zuletzt von Death (20. Januar 2013 um 21:15)

  • ja kein Problem, nur fehlen halt paar if ob verbindung überhaupt zustande gekommen ist etc.. Die Spieleranzahl stimmt auch nicht ganz, weil ich nur 1 byte von den 2 auswerte, vll hast ja nen server der beide nutzt und du es dann daran testen kanst, wie man die 2 byte richtig zusammensetzt(z.b. der romania stunt in deinen screen von oben. braucht 2 byte :))

    Wenn jemand weiß wie das schöner geht, würd mich auch interessieren, da das immer etwas ein gebastel ist so :)

    Spielerliste auch abrufen:

    Spoiler anzeigen
    [autoit]


    #include "Array.au3"
    $ip ="84.200.21.40";
    $port=9142;
    $debug = 1

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

    Global $socket = 0;

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

    ;Aufbau
    ; 0 1 2 3 4 5 6 7 8 9 10
    ;| S | A | M | P | IP.1 | IP.2 | IP.3 | IP.4 | Port1 | Port2 | OpCode |

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

    UDPStartup()
    connect()
    ;Server Info abrufen
    $msg = getBinary("i",$ip,$port);Hole binäre nachricht
    if($debug==1) Then ConsoleWrite("Message: "&$msg&@CRLF)
    $serverInfo = getInfo("i",$msg)

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

    ;Player-liste abrufen
    $msg = getBinary("d",$ip,$port);Hole binäre nachricht
    if($debug==1) Then ConsoleWrite("Message: "&$msg&@CRLF)
    $playerList = getInfo("d",$msg)

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

    _ArrayDisplay($serverInfo, "ServerInfos", -1, 0, "", "|", "")
    _ArrayDisplay($playerList, "SpielerListe", -1, 0, "", "|", "Index|ID|Nickname|Score|Ping")

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

    ;alles wieder schließen
    UDPCloseSocket($socket)
    UDPShutdown()

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

    Func connect()
    $socket = UDPOPEN($ip,$port);Verbinde mit Server
    if($debug==1) Then ConsoleWrite("UDPOpen: "&$socket[0]&" - Error: "&@error&@CRLF)
    EndFunc

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

    Func getInfo($type, $msg)
    Local $ret = 0

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

    $send = UDPSend($socket,$msg); sende Nachricht
    if($debug==1) Then ConsoleWrite("UDPSend: "&$send&" Bytes gesendet - Error: "&@error&@CRLF)

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

    if($debug==1) Then ConsoleWrite("Warte auf Antwort")
    ;Warte auf Antwort
    Local $data;
    While 1
    if($debug==1) Then ConsoleWrite(".");
    $data = UDPRecv($socket, 1024,1)
    If $data <> "" Then
    ExitLoop
    EndIf
    Sleep(1000)
    WEnd
    if($debug==1) Then ConsoleWrite(@CRLF&" Received: "&$data&@CRLF&@CRLF)

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

    if($type == "i")Then
    $ret = readServerInfo($data)
    ElseIf($type == "d") Then
    $ret = readPlayerInfo($data)
    EndIf

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

    Return $ret
    EndFunc

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

    Func readPlayerInfo($msg)
    Local $structure = "align 1;byte header[11];byte playerCount[2];"

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

    Local $struct = DllStructCreate($structure)
    $pointerToStruct = DllStructCreate("align 1;byte[" & DllStructGetSize($struct) & "];", DllStructGetPtr($struct))
    DllStructSetData($pointerToStruct, 1, $msg)

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

    $playerCount = Int(DllStructGetData($struct,"playerCount",1))
    $struct =0
    $pointerToStruct = 0
    if($playerCount <= 0) Then
    ConsoleWrite("no players"&@CRLF)
    Return
    EndIf

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

    Local $players[$playerCount][4]; ID | Nick | Score | Ping

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

    For $i=0 To $playerCount-1 Step + 1

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

    $structure &= "byte;byte;" ;ID|length
    $struct = DllStructCreate($structure)
    ConsoleWrite($struct)
    $pointerToStruct = DllStructCreate("align 1;byte[" & DllStructGetSize($struct) & "];", DllStructGetPtr($struct))
    DllStructSetData($pointerToStruct, 1, $msg)

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

    $id = DllStructGetData($struct, $i*5 +3)
    $nickLength = DllStructGetData($struct, $i*5 +4)
    $struct =0
    $pointerToStruct = 0

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

    $structure &= "char["&$nickLength&"];int;int;" ;ID|length
    $struct = DllStructCreate($structure)
    ConsoleWrite($struct)
    $pointerToStruct = DllStructCreate("align 1;byte[" & DllStructGetSize($struct) & "];", DllStructGetPtr($struct))
    DllStructSetData($pointerToStruct, 1, $msg)

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

    $nickname = DllStructGetData($struct, $i*5 +5)
    $score = DllStructGetData($struct, $i*5 +6)
    $ping = DllStructGetData($struct, $i*5 +7)
    $struct =0
    $pointerToStruct = 0
    $players[$i][0] = $id
    $players[$i][1] = $nickname
    $players[$i][2] = $score
    $players[$i][3] = $ping
    Next

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

    Return $players
    EndFunc

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

    Func readServerInfo($msg)
    Local $structure = "align 1;byte header[11];byte pass;byte players[2];byte maxPlayer[2];int lengthH;"

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

    Local $struct = DllStructCreate($structure)
    $a = DllStructCreate("align 1;byte[" & DllStructGetSize($struct) & "];", DllStructGetPtr($struct))
    DllStructSetData($a, 1, $msg)

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

    $structure &= "char hostname["&DllStructGetData($struct,"lengthH")&"];int lengthG;"
    $struct = 0;Struct freigeben

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

    $struct = DllStructCreate($structure)
    $a = DllStructCreate("align 1;byte[" & DllStructGetSize($struct) & "];", DllStructGetPtr($struct))
    DllStructSetData($a, 1, $msg)

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

    $structure &= "char gameMode["&DllStructGetData($struct,"lengthG")&"];int lengthMapName;"
    $struct = 0;Struct freigeben

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

    $struct = DllStructCreate($structure)
    $a = DllStructCreate("align 1;byte[" & DllStructGetSize($struct) & "];", DllStructGetPtr($struct))
    DllStructSetData($a, 1, $msg)

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

    $structure &= "char mapName["&DllStructGetData($struct,"lengthG")&"];"
    $struct = 0;Struct freigeben

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

    $struct = DllStructCreate($structure)
    $a = DllStructCreate("align 1;byte[" & DllStructGetSize($struct) & "];", DllStructGetPtr($struct))
    DllStructSetData($a, 1, $msg)

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

    Local $serverInfo = "ServerInfo:"&@CRLF
    $players = DllStructGetData($struct,"players",1);
    $maxPlayers = DllStructGetData($struct,"maxPlayer",1);

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

    $hostname = DllStructGetData($struct,"hostname");
    $gameMode = DllStructGetData($struct,"gameMode");
    $mapName = DllStructGetData($struct,"mapName");
    $struct = 0;Struct freigeben

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

    $serverInfo &= "Hostname: "&$hostname &@CRLF
    $serverInfo &= "Spieler: "&$players&"/"&$maxPlayers&@CRLF
    $serverInfo &= "MapName: "&$mapName&@CRLF
    $serverInfo &= "GameMode: "&$gameMode&@CRLF
    Local $serverInfo[5]
    $serverInfo[0] = $hostname
    $serverInfo[1] = $players
    $serverInfo[2] = $maxPlayers
    $serverInfo[3] = $mapName
    $serverInfo[4] = $gameMode
    Return $serverInfo
    EndFunc

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

    Func getBinary($opCode, $ip, $port)
    Local $_ip = StringSplit($ip,".");

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

    If($_ip[0] <4)Then
    exit(0)
    EndIf

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

    Local $msg = DllStructCreate("align 1;char samp[4];char ip[4];char port[2];char opcode")

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

    DllStructSetData($msg, "samp", "SAMP");

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

    DllStructSetData($msg, "ip", Chr($_ip[1]),1);
    DllStructSetData($msg, "ip", Chr($_ip[2]),2);
    DllStructSetData($msg, "ip", Chr($_ip[3]),3);
    DllStructSetData($msg, "ip", Chr($_ip[4]),4);

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

    DllStructSetData($msg, "port", $port,1);
    DllStructSetData($msg, "port", BitShift($port,8),2);

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

    DllStructSetData($msg, "opcode", $opCode);

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

    Return DllStructGetData(DllStructCreate("align 1;byte[" & DllStructGetSize($msg) & "]", DllStructGetPtr($msg)), 1)
    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von Death (5. Februar 2013 um 17:09)