Seite 1 von 1

Netzwerk Spiel

Verfasst: 26.11.2004 17:53
von Lukas-P
Hallo,

ich möchte ien Netzwerkspiel erstellen. Doch wie kann ich eine Liste schicken?

Verfasst: 26.11.2004 18:14
von MVXA
Guck mal hier: http://robsite.de/php/pureboard/viewtopic.php?t=991 oder benutz einfach die Foren suche. Das thema wurde schon näher beschrieben. Ganz unten kannst du dann eine Packetstruktur von mir sehen. Das ist ne ziehmlich gute lösung.

Verfasst: 26.11.2004 18:44
von Lukas-P
ja nur ich will eine ganze liste senden bzw. empfangen

Verfasst: 26.11.2004 19:07
von MVXA
Was für eine Liste, selbst definierte Liste, Linked List oder Array ? Ich schreib dann halt schnell eine Prozedur die sendet und empfängt...

Verfasst: 26.11.2004 20:25
von Lukas-P
Linked List

Verfasst: 26.11.2004 20:42
von MVXA

Code: Alles auswählen

Structure sNetPacket 
        pakBefehl.l 
        pakLeange.l   
        pakData.s  
EndStructure

Global DummyNetPacket.sNetPacket 

Procedure.l HexToLong(strHex.s)
    DefType.l HexLen, ptrI, ZeichenASC, Dec
    DefType.s Zeichen
    
    strHex = UCase(strHex)
    HexLen = Len(strHex)
    
    For ptrI = 0 To HexLen - 1
        Zeichen = Mid(strHex, HexLen - ptrI, 1)
        
        If Asc(Zeichen) >= 65 And Asc(Zeichen) >= 55 + 16
            ProcedureReturn 0
        EndIf        
        
        If Asc(Zeichen) >= 65
            ZeichenASC = 10 + Asc(Zeichen) - 65
        Else
            ZeichenASC = Val(Zeichen)    
        EndIf
        Dec + ZeichenASC * Pow(16, ptrI)
    Next 
    ProcedureReturn Dec
EndProcedure

Procedure SplitNetPacket(ReceivedPacket.s, *CallFnkPtr.l)
    DefType.s tmpPacket, tmpNetData
    DefType.l tmpPacketPtr, tmpLaenge, tmpBefehl    

    Repeat
        tmpPacketPtr + 1
        tmpPacket = StringField(ReceivedPacket, tmpPacketPtr, Chr(4))
        If tmpPacket <> ""
            tmpBefehl  = HexToLong(StringField(StringField(tmpPacket, 1, Chr(1)), 1, Chr(2)))
            tmpLaenge  = HexToLong(StringField(StringField(tmpPacket, 1, Chr(1)), 2, Chr(2)))
            tmpNetData =                       StringField(tmpPacket, 2, Chr(1))
            If Len(tmpNetData) = tmpLaenge 
                Debug "/CMD: " + Str(tmpBefehl) + "/LEN: " + Str(tmpLaenge)  + "/DAT: " + tmpNetData
                DummyNetPacket\pakBefehl   = tmpBefehl
                DummyNetPacket\pakLeange   = tmpLaenge
                DummyNetPacket\pakData     = tmpNetData     
                
                CallFunctionFast(*CallFnkPtr, @DummyNetPacket)
		; Funktion aufrufen, die das Packet nun "ausführt"
            Else
                ; Wir haben ein fehlerhaftes Packet, ne Mißgeburt geangelt, tu was du willst.
		; Wer jetzt sagt, Packete sind auch lebewesen, der sollte echt mal den PC 
		; aus machen o_O
            EndIf
        EndIf
    Until tmpPacket = ""
EndProcedure

Procedure.b SendNetPacket(lngBefehl.l, strData.s)
    DefType.l PaketLen
    
    PaketLen = Len(strData)+32
    *TCPSendBuffer = AllocateMemory(PaketLen)
    PokeS(*TCPSendBuffer, Hex(lngBefehl))
    PokeB(*TCPSendBuffer+4, 2)
    PokeS(*TCPSendBuffer+5, Hex(Len(strData)))
    PokeB(*TCPSendBuffer+9, 1)
    PokeS(*TCPSendBuffer+10, strData)
    PokeB(*TCPSendBuffer+(Len(strData)+10), 4)            

    Debug "Sending Buffer: " + PeekS(*TCPSendBuffer)
    SendNetworkData(*TCPSendBuffer, Len(strData)+32)
    RtlFillMemory_(*UDPSendBuffer, PaketLen, 0)
    FreeMemory(*UDPSendBuffer)
EndProcedure

ForEach DeineList()
   tmpListData = tmpListData + DeneList() + Chr(3)
Next
tmpListData = Left(tmpListData, len(tmpListData)-1)
SendNetPacket(0, tmpListData) ; packet senden und angeben das es sich um den Befehl null handelt
Ich mag den Code. Wenn du auch wissen willst wie du die Linked Liste dann wieder aus dem Packet in eine echte liste bekommst, sag bescheid (hatte dazu jetzt kein nerv das jetzt auf die schnelle zu machen /:-> )
!!!ACHTUNG!!:es handelt sich hier um ungetesteten Code !