Hilfe, Konstante Variablen werden verändert o_O

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Hilfe, Konstante Variablen werden verändert o_O

Beitrag 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.
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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
Bild
Benutzeravatar
SirCus
Beiträge: 182
Registriert: 10.09.2004 11:44
Wohnort: München
Kontaktdaten:

Beitrag 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.
2D Game H.E.R.A. (Entwicklung eingefroren)
www.chamaeleo-fx.de.vu

- mein Lieblingszitat
"die Informationsumwelt wird von einer fürchterlichen Menge an Unsinn und Lügen verschmutzt" (Stanislaw Lem, Lokaltermin, 1954 (!) )
http://www.stanislaw-lem.de/zitate/zitate.shtml
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag 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.
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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 ?
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von NicTheQuick »

Das steht in den Sternen. /:->
Dieser Wunsch wurde schon vor Jahren geäußert und bisher noch nicht umgesetzt.
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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
Bild
Antworten