Seite 1 von 1

Hilfe, Konstante Variablen werden verändert o_O

Verfasst: 11.09.2004 14:58
von MVXA
Hallo.
Ich bin ja hobbyzocker und spiel gerne ET. Nun hab ich mir aus Langeweile ein Programm geschrieben, dass analysiert was ET zum Server sendet und was der Server wieder zurück sendet. Nun hab ich das Programm soweit programmiert, dass es Server und Client auf macht und Packete in einer Datei speichert und weiter sendet. Mein Problem ist, dass ich in der Konsole ein Buchstaben wirwar bekomme o_O Der Buchstabenchaos ist meistens dann, wenn ich Ausgebe, dass der Server was gesendet hat. (kann aber auch nicht überprüfen ob das, was der Server bekommt auch das richtige Packet ist, vielleicht hat er auch so ein Zeugs bekommen o_O.) ich zeig euch am bessten mal den Code:

Code: Alles auswählen

;{ Konstanten 
    #app_version = "0.0.1"
    
    Enumeration
        #fil_LogFile
    EndEnumeration    
;}
;{ Variablen 
    Global My_Host.s 
    Global My_Port.s

    Global Server_Host.s
    Global Server_Port.s
    
    Global Used.l
;}
;{ Declare
    Declare   CPrint(pText.s)
    Declare.s ACharToOEM(Text.s)
    Declare   UDPServer(Wert.l)
    Declare   UDPClient(Wert.l)
    Declare   BuildClient()
    Declare   CommandParsing()
;}
;{ Sockets
    Global ETServer.UDPConnect
    Global ETClient.UDPConnect
    
    Global ETOrginal.UDPUserID
;}
;{ Threads
    Global ServerThrd.l 
    Global ClientThrd.l 
;}

If OpenConsole() <> 0 
    ConsoleCursor(10)

    CPrint("^O -=^L Packet Analyse ^O=- ^J[" + #app_version + "]\\")

    CPrint("^O------------------------\")
    CPrint("^O-- ^Llade Programmbasis ^O--\")
    CPrint("^O------------------------\")
    
    CPrint("^OParse Argumente ab...")
    CommandParsing()
    CPrint("^JOK\")
    
    CPrint("^OLade UDP Netzwerk....")
    If UDPInitNetwork() <> 0 
        CPrint("^JOK\")
    Else
        CPrint("^LERROR\")
    EndIf
    
    CPrint("^OLade TCP Netzwerk....")
    If InitNetwork() <> 0 
        CPrint("^JOK\")
    Else
        CPrint("^LERROR\")
    EndIf    
    
    My_Host = IPString(UDPGetLocalIP()) 
    If My_Port = "" 
        My_Port = "27965"    
    EndIf
    CPrint("^OLokaler PC: ^J" + UCase(Hostname()) + " ^N(" + My_Host + ")\")
    CPrint("^OÖffne Logfile...")
    If CreateFile(#fil_LogFile, "C:\packets.txt") <> 0
        CPrint("^JOK\")
    Else 
        CPrint("^LERROR\")
    EndIf
    CPrint("\")

    CPrint("^O---------------------\")
    CPrint("^O-- ^Llade ServerFake ^O--\")
    CPrint("^O---------------------\")    
    CPrint("^OBaue ^LServer^O auf...\")
    If Server_Host = ""
        CPrint("^OBitte geben Sie die ECHTEN ^LServer^Odaten an.\")
        CPrint("^LServer:")
        Server.s = Input(): CPrint("\")
        Server_Host = Trim(StringField(Server, 1, ":"))
        Server_Port = Trim(StringField(Server, 2, ":"))    
    EndIf 
    CPrint("^OServerFake zu diesen ^LDaten^O konfiguriert: \")
    CPrint("    ^OHost: ^N" + Server_Host + "\")
    CPrint("    ^OPort: ^N" + Server_Port + "\")
    CPrint("^OÖffne Server...")    
    If UDPCreateServer(Val(My_Port), ETServer)
        CPrint("^JOK ^N(" + My_Port + ")\")
        CPrint("^OUDPEventThread: ^N" + Str(UDPStartCaptureEvents(ETServer)) + "\")
    Else  
        CPrint("^LERROR\")
    EndIf
    CPrint("^OStarte ^LUDP ^OStack...")
    ServerThrd = CreateThread(@UDPServer(), 0)
    If ServerThrd <> 0 
        CPrint ("^JOK ^N(" + Str(ServerThrd) + ")\")
    Else
        CPrint("^LERROR\")
    EndIf    
    
    CPrint("\^O -=^l Packet Analyse ^O=- ^J ist nun ^LAKTIV^O!\")
    Input()
    ;Repeat: Delay(10): Until Inkey() <> ""
    
    CPrint("^O---------------------\")
    CPrint("^O-- ^LShutdown System ^O--\")
    CPrint("^O---------------------\")    
    UDPEndCaptureEvents(ETServer)
    UDPCloseServer(ETServer)
    
    If ServerThrd <> 0 
        KillThread(ServerThrd) 
    EndIf
    If ClientThrd <> 0 
        KillThread(ClientThrd)
    EndIf
    
    ClearConsole()
    CloseConsole()
    End
EndIf

Procedure UDPServer(Wert.l)
    ; Verarbeitet Packete die vom Client kommen 
    DefType.l *ServerBuffer
    DefType.l BytesGet
    DefType.s Packet    
    
    *ServerBuffer = AllocateMemory(1025)
    PokeS(*ServerBuffer, Space(1024))
    Debug "ServerThread gestartet..."
    Debug "ServerBuffer: " + Str(*ServerBuffer) + " (" + Str(MemoryStringLength(*ServerBuffer)) + ")"
    
    Repeat
        BytesGet = UDPWaitUntilReceive(ETServer, *ServerBuffer, 1024)
        If BytesGet > 0 
            Debug "ClientPacket: " + Str(BytesGet) + " " + PeekS(*ServerBuffer, BytesGet)
            WriteStringN(FormatDate("%hh:%ii:%ss", Date()) + ">:" + PeekS(*ServerBuffer, BytesGet))
            CPrint("^J>^OPacket vom Client...")
            Packet = PeekS(*ServerBuffer, BytesGet)
            
            Select Packet
                Case "ÿÿÿÿgetchallenge"
                    CPrint("^nCONNECTION REQUEST\")
                    If Used = 0 
                        CPrint("^OSpeichere ClientID...")
                        UDPSaveUserID(ETOrginal, ETServer)
                        CPrint("^JOK\")
                    
                        BuildClient()
                    EndIf
                Case "ping"
                    CPrint("^nPING\")
                    BuildClient()
                Default
                    CPrint("^nUNBRAUCHBAR\")
            EndSelect
            
            UDPSend(ETClient, *ServerBuffer, 1024)
            PokeS(*ServerBuffer, " " + Chr(0))
        EndIf
    ForEver    
EndProcedure

Procedure UDPClient(Wert.l)
    ; Verarbeitet Packete die vom Server kommen 
    DefType.l *ClientBuffer
    DefType.l BytesGetClient
    DefType.s PacketForClient    
    
    Debug "ClientThread gestartet..."
    *ClientBuffer = AllocateMemory(5125): PokeS(*ClientBuffer, Space(5120))
    Debug "ClientBuffer: " + Str(*ClientBuffer) + " (" + Str(MemoryStringLength(*ClientBuffer)) + ")"
    
    Repeat
        BytesGetClient = UDPWaitUntilReceive(ETClient, *ClientBuffer, 5120)

        If BytesGetClient => 0 
            Debug "ServerPacket: " + Str(BytesGetClient) + " " + PeekS(*ClientBuffer)
            CPrint("^J<^OPacket vom Server...")
            WriteStringN(FormatDate("%hh:%ii:%ss", Date()) + "<:" + PeekS(*ClientBuffer, BytesGetClient))
            PacketForClient = PeekS(*ClientBuffer, BytesGetClient)
            
            CPrint("^nUNBRAUCHBAR\")
            
            UDPLoadUserID(ETOrginal, ETServer)
            UDPSend(ETServer, *ClientBuffer, BytesGetClient)
            PokeS(*ClientBuffer, Space(BytesGetClient))
        EndIf
        
        Delay(500)
    ForEver        
EndProcedure

Procedure BuildClient()
    CPrint("^OBaue Client auf...")
    If ClientThrd = 0 
        If UDPConnectServer(Val(Server_Port), Server_Host, ETClient) <> 0 
        CPrint("^JOK\")
            CPrint("^OUDPEventThread: ^N" + Str(UDPStartCaptureEvents(ETClient)) + "\")
            CPrint("^OBaue UDPClient Thread auf...")
            ClientThrd = CreateThread(@UDPClient(), 0)
            If ClientThrd <> 0 
                CPrint ("^JOK ^N(" + Str(ClientThrd) + ")\")
            Else
                CPrint("^LERROR\")
            EndIf                             
            CPrint("^OClient zu ^L" + Server_Host + "(" + Server_Port + ")^O verbunden !\")
            CPrint("^OBreit zum Packetfluss !\")
            Used = 1
        Else
            CPrint("^LERROR\")
        EndIf
    Else 
        CPrint("^LERROR\")
    EndIf        
EndProcedure

Procedure CommandParsing()
    DefType.s Befehl, Parameter, Param
    
    Repeat
        Param     = ProgramParameter()
        Befehl    = StringField(Param, 1, "=")
        Parameter = StringField(Param, 2, "=")
        
        Select LCase(Befehl)
            Case "/server"
                Server_Host = Trim(StringField(Parameter, 1, ":"))
                Server_Port = Trim(StringField(Parameter, 2, ":"))                   
            Case "/port"
                My_Port = Trim(Parameter)
        EndSelect
        
    Until Param = ""
EndProcedure

Procedure CPrint(pText.s)
    DefType.l I
    DefType.s Color 
    
    For I = 1 To Len(pText)
        If Mid(pText, I, 1) = "^"
            Color = UCase(Mid(pText, I + 1, 1))

            Color = ReplaceString(Color, "A", "1")  ; 1   Blau 
            Color = ReplaceString(Color, "B", "2")  ; 2   Grün 
            Color = ReplaceString(Color, "C", "3")  ; 3   Türkis 
            Color = ReplaceString(Color, "D", "4")  ; 4   Rot 
            Color = ReplaceString(Color, "E", "5")  ; 5   Magenta 
            Color = ReplaceString(Color, "F", "6")  ; 6   Braun 
            Color = ReplaceString(Color, "G", "7")  ; 7   Hellgrau (Std.)
            Color = ReplaceString(Color, "H", "8")  ; 8   Dunkelgrau 
            Color = ReplaceString(Color, "I", "9")  ; 9   Hellblau 
            Color = ReplaceString(Color, "J", "10") ; 10  Hellgrün 
            Color = ReplaceString(Color, "K", "11") ; 11  Cyan
            Color = ReplaceString(Color, "L", "12") ; 12  Hellrot 
            Color = ReplaceString(Color, "M", "13") ; 13  Helles Magenta 
            Color = ReplaceString(Color, "N", "14") ; 14  Gelb 
            Color = ReplaceString(Color, "O", "15") ; 15  Weiß 
            
            ConsoleColor(Val(Color), 0)
            I = I + 1
        ElseIf Mid(pText, I, 1) = "\"
            PrintN("")
        Else
            Print(ACharToOEM(Mid(pText, I, 1)))
        EndIf
        Delay(1)
    Next
    ConsoleColor(7, 0)
EndProcedure

Procedure.s ACharToOEM(Text.s)
    DefType.l FunkCTO
    
    OpenLibrary(0, "user32.dll") 
    *FunkCTO = IsFunction(0, "CharToOemA")
    CallFunctionFast(*FunkCTO, Text, Text) 
    CloseLibrary(0)
    
    ProcedureReturn Text
EndProcedure
Ist noch im Debugmodus :oops: übrigens, mit ET meine ich Wolfensetin Enemy Territory.

Verfasst: 11.09.2004 15:01
von MVXA
Ncahtrag:
hab was vergessen, für die, die kein Enemy Territory haben (und auch nicht planen es sich wegen meinem kleinen problem zu laden) hier ein ausschnitt, wie es dann in der console aussieht o_O:

Code: Alles auswählen

PacketP avcket v omm  CSlerveri.e.n.tUNBRAUCHBAR
 ..PING
Baue Client auf...CLIENT BEREITS AKTIV !
PacketPacket vom Server...UNB RvAoUmCHBAR
 Client...PING
Baue Client auf...CLIENT BEREITS AKTIV !
Packet vom Client...PING
Baue Client auf..P.ack eLtI ENvoTm  BE e rEvIeTSr. .A.KTIUVN B!R
AUCHBAR
Packet vom Server...UNBRAUCHBAR

Verfasst: 11.09.2004 15:05
von SirCus
nur mal so: es gibt keine konstanten Variablen.
entweder Konstante, oder Variable.

in etwa so wie es keine geraden Kurven oder gebogene Geraden gibt...

naja ok.. wenn ne Variable über längeren Zeitraum konstant bleibt, dann könnte man natürlich sagen das ist eine konstante Variable.. meintest du das?

..wollte nur mal sinnlosen senf dazu abgeben, kann dir bei deinem Problem aber nicht helfen, sorry.

Verfasst: 11.09.2004 15:22
von MVXA
also ich meine, die texte die in den Funktions aufruf

Code: Alles auswählen

CPrint()
stehen, werden irgendwie nicht so ausgeben, wie es in der Konstante steht.

Verfasst: 11.09.2004 17:52
von NicTheQuick
Ohne es zu testen behaupte ich einfach mal, dass es an den Threads liegt, weil du dort Strings benutzt und im Hauptprogramm auch. Da PureBasic bei Threads noch nicht Stringsicher ist, kannst du das Vorgehen so vergessen. Du musst also versuchen komplett ohne Threads zu arbeiten oder sämtliche String-Operationen trennen. Das heißt, wenn an einer Stelle ein String manipuliert oder auch nur übergeben wird, darf an einer anderen Stelle keine String-Operation laufen, da sie sich sonst sozusagen vermischen können.

Verfasst: 11.09.2004 18:09
von MVXA
mmmh, daran könnte es liegen, da jedesmal die buchstaben anders vertauscht werden. ich versuch dann ma das ganze um zu schreiben. danke für deine Hilfe. eine frage hätt ich dann aber noch, wann wird PB den string sicher in threads sein ?

Verfasst: 11.09.2004 18:36
von NicTheQuick
Das steht in den Sternen. /:->
Dieser Wunsch wurde schon vor Jahren geäußert und bisher noch nicht umgesetzt.

Verfasst: 11.09.2004 19:46
von MVXA
*off topic*

also kann das noch dauern, stimmts ? toll.... langsam schwank ich wirklich ob ich mir nicht doch ein anderen compiler kaufen sollte o_O das wirkt nicht gerade einladend... naja, ich bekomm zum geburtstag (is ja bald, 23.09) dann PB :D