Netzwerk Libs

Kommentare anzeigen Worklog abonnieren
Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6  Weiter

Worklogs Netzwerk Libs

Beta

Freitag, 18. Juni 2010 von ToeB
Tut mir leid die Beta wird sich doch wohl etwas verschieben, mir sind wichtigere dinge dazwischengekommen.. !

Wann weiß ich noch nicht werde es aber hier reinschreiben..

mfg ToeB

UDP_ChangeHost() + Bugfixes

Montag, 14. Juni 2010 von ToeB
user posted image

So die Function

UDP_ChangeHost( SpielerNummer [, CommandoHandle] [, CommandoParameter] )

Ist jetzt komplett drin. Ich hab mir die Nacht um die Ohren geschlagen um etliche Fehler auszumerzen, die dabei auftreten. Man kann auch schon die Zusatz-Informationen senden, also einfach einen Command erstellen und bei der Function angeben, dann bekommt der andere Server das auch. Wer auf nummer sicher gehen will, schickt vorher mit dem Sicheren senden die Daten rüber und benutz dann UDP_ChangeHost (da es dort direkt gesendet wird und nicht sicher ).

Auch sind ein paar Bugs , die ich beim Programmieren bemerkt habe, gefixed. Denn ich hab gemerkt dass man im Commando zwar meherere Banks angeben kann, aber es wird nur eine Gesendet, das wurde verbessert.

Auch wird der Ping jetzt hochgezhählt wenn das andere Programm nicht antwortet.


Auch Suche ich leute, die gern mal ausführlich meine SimpleUDP2.0 Testen möchten. Dafür währen sowohl "Profis" als auch Blitzbasic anfänger gern gesehen, da mich intressiert ob alles gut verständlich ist etc. Das Testen würde das schreiben eines Eigenem Beispieles beihalten, also es muss nix mit grafik und so sein, um gottes willen, nur so ein einfaches "Chat" beispiel etc. Dann müsst ihr mir nur sagen, was ihr gut und was ihr schlecht fandet. Auch könntet ihr einfach eines der Fertigen Beispiele testen, und mir dann Bugs reporten. Wäre nett wenn sich einer Anbieten würde ! Ihr könnt euch schon melden, bekommt die Version aber fühstens am Feritag diser Woche (18.06), da ich noch kleine Functionen einbauen muss.


mfg ToeB

UDP_ChangeHost()

Samstag, 12. Juni 2010 von ToeB
user posted image

So es gibt eine neue Function die es in sich hat : UDP_ChangeHost( PlayerID )

Diese Function dient dazu, den Host mitten im Spiel zu wechseln. Das wäre z.B. super, wenn man Host ist und das Spiel beenden möchte, aber die anderen noch weiter spielen lassen will. Dann sucht man sich einfach den Spieler mit dem Niedrigsten Ping aus (oder mit dem Schönsten Namen) und wendet UDP_ChangeHost() auf ihn an. Dann wird Automatisch der Host gewechselt, und man kann beenden. Leider muss man das UDP_ChangeHost einmal in der Schleife mit UDP_Update aufrufen, also so
Code: [AUSKLAPPEN]
Repeat
   UDP_Update()
   If KeyHit(1) Then UDP_ChangeHost( RandomID ) : ChangedHost = 1
   If UDP_Connected = 1 And ChangedHost = 1 Then Exit
Forever
UDP_End()


Dann wird es klappen, so klappt es nicht :
Code: [AUSKLAPPEN]
Repeat
   UDP_Update()
Until KeyHit(1)
UDP_ChangeHost( RandomID )
UDP_End()


Im Moment ist die Function und alles drum herum so weit, das man wenn man EINEN Host und EINEN Client hat, dass man ständig den Host zwischen ihnen Wechseln kann (IP / Port bleiben gleich ). Eingebaut werden muss noch, dass es auch anderen Clients mitgeteilt wird und dass man zusätzliche Daten mitschicken kann (per CMD's), also dass das entweder so aussieht :
Code: [AUSKLAPPEN]
UDP_ChangeHost( PlayerID [, cmdID] [, cmdParameterList$] )

Und somit kann man dann auch banken etc. verschicken (z.B. für playerpositionen oder Leben / Geld).

mfg ToeB



Bugfixes

Samstag, 5. Juni 2010 von ToeB
user posted image

So da ich keine Kommentare zu meiner Techdemo bekommen habe wird die Lib nicht mehr weitergemacht und Chrise kann zusehen wie er klar kommt.

Nein Scherz Very Happy
Ein paar Kommentare währen aber schon nett Wink

Als ich bin beim Testen meiner Lib im Netzwerk auf einen Schlimmen fehler gestoßen. Und zwar, wenn man in den Chat schreibt "Hallo, das wetter ist schön", dann erkennt meine Lib das Komma als Abgrenzung und will zwei parameter senden, "Hallo" und " das wetter ist schön". Aber Das soll ja nicht Very Happy Deshalb muss man jetzt den String in "" setzten, also Chr(34) + "Hallo, das wetter ist schön" + Chr(34). Falls man nur den String in einen Command versendet (also nur UDP_AddCmd("String") ), dann brauch man das nicht. Auch kann man es weglassen wenn man sicher geht das im String kein Komma steht, Heißt also man braucht die "" nicht zu machen, nur falls man doch ein Komma drin hat, dann sollte man es, sonst kommt es zu übertragungsfehlern (nur bei meherene Commands). Beispiel :
Code: [AUSKLAPPEN]
UDP_SendCmd( cmd_chat, "Das wetter, das ist schön") ;>> Geht
UDP_SendCmd( cmd_chat, Chr(34) + "Das wetter, das ist schön" + chr(34)) ;>> Geht
UDP_SendCmd( cmd_chat, "Das Wetter, das ist schön !" + "," + r + ","+ g + "," + b) ;>> Geht nicht
UDP_SendCmd( cmd_chat, Chr(34) + "Das Wetter, das ist schön !" + Chr(34) + "," + r +"," + g + ","+ b +",") ;>> Geht


Auch habe ich die Function UDP_SendCmd nochmals geschleunigt, da ich das Stringparsing nur einmal, und nicht für jeden Spieler einzeln durchführe. Ist zwar nur minimal, aber doch schneller als vorher Wink

mfg ToeB

SimpleUDP 2.0 - Tech Demo

Samstag, 29. Mai 2010 von ToeB
user posted image

Die TechDemo ist da !!

In der Techdemo ging es mir darum, möglichst viele Features der SimpleUDP2 darin einzubauen. Auch ging es mir darum, in dem Quellcode das Anwenden der Befehle zu erörtern mithilfe von Kommentaren und übersichtligem Code. Den Code werde ich aber nur zusammen mit der SimpleUDP2 veröffentlichen, deshalb gibts hier nur ne EXE.

Was ist in der TechDemo enthalten ?
Arrow Übersichtliches Menü mit einer kleinen Simplen GUI
Arrow Server-Einstellungen ändern
Arrow Server erstellen
Arrow Client-Daten ändern
Arrow Auf dem Server connecten
Arrow Chat, sogar mit Scrollfunktion, somit kann man alle sachen lesen
Arrow Spieler bwegunng mit der Maus (man muss ins Feld reinklicken )
Arrow Spielerliste
Arrow Spieler Informationen

Screenshot ?
Jap ! Hier Very Happy :
user posted image


Download ?
Jap ! Hier Very Happy :
>> Download SimpleUDP2.0 - TechDemo << (*.rar Datei, ~512 Kb )

Edit :
So es gibt jetzt ne kleine änderung in der Version. Und zwar das die Nachrichten, die gescihert gesendet wurden, werden beim Empfänger zwischengespeichert. Diese werden aber nur 1000ms zwischengespeichert, dadurch kann es sein, wenn der ping > 500ms ist das es zwei nachrichten gibt. Das würde zwar nur in 0.001% aller Fälle vorkommen, aber ich habe jetzt die Zeit hochgesetzt auf 5000. Auch wurden oft Nachrichten 4 mal angezeigt, obwphl nur eine Nachricht kam, das wurde auf beseitigt.


Edit : Ich würde mich übrigens doch über kommentare freuen Wink



mfg ToeB



Beispiel

Freitag, 28. Mai 2010 von ToeB
user posted image

Nein es gibt Noch keinen Download, falls ihr das jetzt erwartet habt Wink Aber es gibt etwas zu ansehen... Ich arbeite zurzeit an einem Beispiel, schön auskommentiert und schön verständlich und übersichtlich, eine Tech-Demo, die alles beinhalten soll was die SimpleUDP so kann. Also senden von Daten, von sicheren Daten, Spieler verwaltung (kicken / bannen), und hinterher noch vieles mehr. Ich hab im übrigen jetzt auch Namen eingebaut, die muss mann jetzt auch nicht mehr beim hosten oder joinen angeben, sonder der name wird standartmäßig auf "unnamed" gesetzt. Dann kann man durch die Funktion UDP_ChangeName( NeuerName$ ) seinen Namen jeder zeit ändern, egal wann und wo, selbst wenn man noch nicht mit dem Server verbunden ist. Der Name wird nämlich so lange zwischengespeichert bis man mit einem Server verbunden ist, dann wird er geändert. So jetzt zum Beispiel. Erstmal gibt es ein Ausführliches Menü mit "schöner" ( Rolling Eyes ) GUI, in dem man alles Einstellen kann. im Haubtteil soll es einen Chat geben, von dem der Server aus alles verwalten kann (also "/kick" z.B. um einen Spieler zu kicken etc. ) Dann gibt es eine Spieler Liste und einen Bereich wo Spezielle Client daten angezeigt werden, wenn man mit der Maus über sie fährt. Um da ein bisschen bewegung reinzubringen, kann man noch seine "Spielfigur" (ein kreis) mit der Maus bewegen. Man klickt einfach und der Kreis folgt der Maus. Un das nicht nur auf dem eigenem Bildschirm Wink. So Hier der Screen, sry für die schlechte Quali, aber ich wollte hier keinen Monsterscreen für die paar sachen reinstellen Wink

user posted image

Auch habe ich beim schreiben des Beispiels noch Fehler in der SimpleUDP endeckt, und zwar das wenn der Client eine Nachricht an alle schickt, dann schickt er diese erst an der Server und der verteilt diese weiter. Das Problem war, das der Client, der die nachricht verschickt hatte, sie selbst wieder empfing, heißt also der Server hatte dem absender die Nachricht zurückgeschickt. Ist ein einfaches Problem, aber bis ich das mal gefunden habe.... Ihr kennt das sicherlich xD

mfg ToeB

Logo + SimpleUDP 2.0

Mittwoch, 26. Mai 2010 von ToeB
user posted image

So dank Chrise hab ich jetzt auch nen Logo für die SimpleUDP Very Happy (danke nochmals !)

Auch hat sich was an der Lib getan, ich hab nämlich folgendes eingebaut :
Arrow Spieler nach ID / IP (Sowohl Gepunktet, xxx.xxx.xxx.xxx, als auch als Int ) Kicken. Gibt man eine IP an, so werden ALLE Spieler disere IP gekickt. Zusätzlich kann man noch einen Grund nennen, der wird dann mitgeschickt.
Arrow Spieler nach ID / IP (Sowohl Gepunktet, xxx.xxx.xxx.xxx, als auch als Int ) Bannen. Gibt man eine IP an, so werden ALLE spieler dieser IP gebannt. Zusätzlich kann man noch einen Grund oder die Bannzeit (in ms) nennen, wird dann mitgeschickt.

Bei beiden Funktionen wird automatisch erkannt, ob es sich um eine Gepunktete IP handelt, oder um eine in Integer Form, oder um eine ID. Beim Bannen krigt der Spieler beim Connecten eine Nachricht, wie lange und aus welchem Grund er gebannt worden ist (falls ein Bann für ihn vorhanden). Das ganze ließt man dann mit den Events aus. Mal ein Beispiel, ist noch nicht fertig auskommentiert, aber man kann ungefähr erkennen wie es aufgebaut ist :
Code: [AUSKLAPPEN]
Graphics 400,300,16,2
SetBuffer BackBuffer()

;SimpleUDP2 - Funktionen einbinden
Include "SimpleUDP2.bb"

;Eingabe für den Start
Print "1 - Sitzung Erstellen"
Print "2 - Sitzung Beitreten"
host_or_join = Input( "> " ) ; Eingabe
maxplayers = 10

If host_or_join = 1 Then ;Wenn man 'Sitzung Erstellen' gewählt hat
   startgame = UDP_HostGame( maxplayers, UDP_NetGame, 8000 , 0) ;Einen Host erstellen, der Internetfähig ist und auf dem Port 8000 läuft
   If startgame = 0 Then ;Wenn der Host nicht erstellt werden konnte
      RuntimeError( "Sitzung konnte nicht erstellt werden !"+Chr(10)+Chr(10)+"Port "+UDP_ServerPort+" wird bereits auf ihrem Computer verwendet !" )
   EndIf
ElseIf host_or_join = 2 ;Wenn man 'Sitzung Beitreten' gewählt hat
   tmpIP$ = "192.168.0.2";Input("IP : ")
   error = UDP_JoinGame( tmpIP$, 8000 ) ;Dem host der IP '127.0.0.1' (localhost) auf dem Port 8000 beitreten
   If error = 0 Then ;Wenn kein Stream erstellt worden ist
      RuntimeError( "Konnte keinen Stream erstellen !" )
   EndIf
EndIf

Dim Xpos(UDP_MaxPlayers),YPos(UDP_MaxPlayers)
Global SendID = -1


Global timer = CreateTimer(60)

;Sende - Commands erstellen
Global cmd_Pos = UDP_AddCmd("short,short")


Repeat
   FPSms = MilliSecs()
   AppTitle FPSTime
   ;Netzwerk updaten
   UDP_Update( )
   
   ;Empfangen
   While UDP_RecvCmd( )
      Select UDP_CmdID
      Case cmd_Pos
         XPos(UDP_CmdFromID) = UDP_CmdParameter[ 0 ]
         YPos(UDP_CmdFromID) = UDP_CmdParameter[ 1 ]
      End Select
   Wend
   
   ;Events auslesen
   While UDP_GetEvent( )
      Select UDP_EventID
      Case Event_ConnectedServer
         Dim XPos(UDP_MaxPlayers),YPos(UDP_MaxPlayers)
      Case Event_NewPlayer
         DebugLog "New Player : "+UDP_EventData$
      Case Event_PlayerLeft
         DebugLog "Player Left : "+UDP_EventData$
      Case Event_PlayerBanned
         DebugLog "Bann"
         If UDP_EventData = UDP_PlayerID Then
            DebugLog "You were banned from the Server ! (Reason : "+UDP_EventMsg$+" | Time : "+(Int(UDP_EventMsg2)/1000.0)+"sek)"
         Else
            DebugLog "Player Banned : "+UDP_EventData$ +" (Reason : "+UDP_EventMsg$+" | Time : "+(Int(UDP_EventMsg2)/1000.0)+"sek)"
         EndIf
      Case Event_NoConnection
         If UDP_EventData = 0 Then DebugLog "Server full !"
         If UDP_EventData = 1 Then
            DebugLog "Your are allready banned from the server ! (Reason : "+UDP_EventMsg$+" | Time : "+(Int(UDP_EventMsg2)/1000.0)+"sek)"
         EndIf
      End Select
   Wend
   
   ;Senden
   If UDP_Connected = 1
      XPos(UDP_PlayerID) = MouseX()
      YPos(UDP_PlayerID) = MouseY()
      UDP_SendCmd( cmd_Pos, XPos(UDP_PlayerID)+","+YPos(UDP_PlayerID), 1, SendID )   ;POSITION SENDEN
   EndIf 
   

   
   If UDP_Host = 0
      If UDP_Connected = 0 Then Color 255,0,0 : Text 0,0,"Nicht verbunden"
      If UDP_Connected = 1 Then Color 0,255,0 : Text 0,0,"Verbunden"
   EndIf

   ;Clienten anzeigen
   textrow = (1-UDP_Host)*13
   mhit = MouseHit(1)
   get = 0
   For tmpClient.UDP_Client = Each UDP_Client
      If RectsOverlap( MouseX(), MouseY(), 1, 1, 0, textrow, 400, 13 )
         Color 128,128,128
         If mHit = 1 Then
            UDP_BannPlayer( tmpClient\ID, 15000, "Wegen der Milch" )
         EndIf
      Else
         Color 255,255,255
      EndIf
      Text 0, textrow, tmpClient\ID+".: "+DottedIP( tmpClient\IP )+":"+tmpClient\Port
      Text 370, textrow, tmpClient\Ping
      textrow = textrow + 13
      Line XPos(tmpClient\ID)-5,YPos(tmpClient\ID)-5,XPos(tmpClient\ID)+5,YPos(tmpClient\ID)+5
      Line XPos(tmpClient\ID)+5,YPos(tmpClient\ID)-5,XPos(tmpClient\ID)-5,YPos(tmpClient\ID)+5
   Next
   WaitTimer(timer)
   
   Flip 0
   Cls
   FPSTime = MilliSecs() - FPSMs
Until KeyHit(1)
;Netzwerk beenden
UDP_End( )
End


mfg ToeB

Danksagungen und Entschuldigung

Montag, 24. Mai 2010 von Chrise
user posted image

Hallo!

Oh, es tut mir so Leid, dass ich es nicht rechtzeitig geschafft habe, die Beispiele für LamaNet 2.0 fertigzustellen. Ich war die letzte Woche sehr beschäftigt und auch an den Wochenenden war ich immer durch etwas verhindert, um ordentlich weiterzumachen.

Natürlich arbeite ich momentan noch an den Beispielen und werde diese diesmal auch genaustens beschildern, damit sich alle Neulinge relativ sofortig auskennen Wink

Ich hoffe es kommen noch ein paar Ideen Zustande! Mich würde es freuen, wenn einige von euch mir schreiben würden, was sie noch wissen wollten, wie etwas bestimmtes mit LlamaNet geht oder funktioniert. Ich werde natürlich gleich diese Fragen beantworten und die Antworten ebenfalls in meine Beispiele mit einbringen!



Übrigens ist mir aufgefallen, dass in der letzten Version die ich heraufgeladen hatte der Header gefehlt hatte. Das hat mich geärgert, denn in dem Header stehen offiziell alle Mitglieder und allgemein Helfer, die mich bisher bei dem Projekt unterstützt haben. Deshalb möchte ich mich hiermit entschuldigen und auch hier die Danksagungen zeigen! Die Reihenfolge der Namen ist durch Zufall entstanden und hat keinerlei Bedeutung. Ich bin jedem gleich dankbar Smile
In der nächsten Version die upgeloadet ist, werden diese Danksagungen natürlich wieder mit enthalten sein!




Nocheinmal Herzlichen Dank für all diejenigen!
Bis zum nächsten Worklog-Eintrag Wink

lg Chrise


SimpleUDP 2.0

Montag, 24. Mai 2010 von ToeB
user posted image

So es gibt jetzt wieder eine Neuerung. Erstmal habe ich den Code mit dem SIcherem Senden mal mit Eingeproggt übers Internet getestet, hat wunderbar genfunzt ( Danke dir nochmal ! ). Dann habe ich mich den halben tag dran gesetzt, nochmal das sichere senden zu überarbeiten, da es oft zu ID fehlern kam, wenn ich nur an eine bestimmte person senden wollte, dann hat entweder alle oder gar keiner die nachricht bekommen. Als ich das gelöst habe, habe ich direkt mal was neues eingebaut.

Senden von DatenBanken
Stellt euch mal vor es muss in Eurem spiel viele Daten am anfang der Runde übertragen werden, also Startpositionen der Spieler, Entity Positionen, türen ob auf oder zu und was weiß ich nicht alles. Da ist es natürlich viel zu aufwendig, jede Daten in die Parameter zu quetschen. Außerdem ist das Blöd wenn man z.B. nicht weiß wie viele Entity psotionen übertragen werden müssen. Dafür kann man dann die ganzen Daten in eine Bank speichern und diese Wird dann unabhängig von der Größe übertragen. Das ganze sieht dann so aus :
Code: [AUSKLAPPEN]
cmd_BankTest = UDP_AddCmd("int,int,bank")

Und dann
Code: [AUSKLAPPEN]
UDP_SendCmd(cmd_BankTest,x+","+y+","+EntityBank)

Und
Code: [AUSKLAPPEN]
If UDP_RecvCmd() = 1 then
    x = UDP_CmdParameter[0]
    y = UDP_CmdParameter[1]
    EntityBank = UDP_CmdParameter[2]
endif

Hier als beispiel, die ersten beiden sind Positionsangaben für den Spieler, die Bank ist hier die Positionen der Entitys. Man kann natürlich auch mehr als eine bank gleichzeitig versenden Wink
Auch ist es hierfür praktisch das man es "gesichert" versenden kann. Dadurch kommt die Bank und die Daten auf jeden fall an und man kann schön spielen Smile

Das schöne dabei ist, die Bank werden von der SimpleUDP selbständig erstellt und nach dem Abruf wieder gelöscht. Dadurch wird der Speicherplatz nicht zu sehr belastet Wink

mfg ToeB

SimpleUDP 2.0

Sonntag, 23. Mai 2010 von ToeB
user posted image

So, ich habe heute den ganzen Tag damit verbracht, Sicheres Senden einzubauen. Die Lib enthält nun folgende Befehle (+Parameter)

Arrow SpielGestartet% = UDP_HostGame( SpielerAnzahl% [, NetzModus%] [, ServerPort%] [, Dediziert%] )
Arrow SpielBereit% = UDP_JoinGame( ServerIP$ [, ServerPort%] )
Arrow UDP_Update( )
Arrow Cmd_Handle% = UDP_AddCmd( ParameterWerteListe$ )
Arrow UDP_SendCmd( Cmd_Handle, ParameterListe$ [, SicheresSenden%] [, SpielerID%] )
Arrow Neue_Nachricht% = UDP_RecvMsg( )
Arrow Neues_Event% = UDP_GetEvent( )
Arrow UDP_End( )

Ich glaub die Parameter bzw. Befehele sollten selbsterklärend sein, was sie bedeuten Wink Aber keine Angst, zusammen mit der SimpleUDP 2.0 gebe ich diesmal eine Beschreibung (Befehls-übersicht + Tuturial ) in einer Datei mit Wink

Sicheres Senden
Wie Funktioniert das Prinzip "Sicheres Senden" ?
Das sichere Senden mit UDP baut ähnlich wie bei TCP (welches ja eine Verlust freie Verbindung garantiert) auf dem System auf, das Jede Nachricht überprüft wird, ob sie angekommen ist. Da UDP (Also das Blitz - UDP) ja bei einer Fehlerhaften Information in einer Nachricht diese komplett "wegwirft" muss man nicht den Inhalt auf vollständigkeit überpürfen, sondern nur, ob die Nachricht angekommen ist oder nicht. Angekommen = Vollständig angekommen. Somit gebe ich Jede Nachricht eine ID. Diese wird mit der Nachricht gesendet. Krigt man eine solche nachricht, so wird geguckt ob schon eine Gespeicherte nachricht mit dieser ID exestiert (durch Ping fehler etc.). Dann werden die Daten ausgelesen und eine Antwort mit dieser ID zurückgeschickt. Der sender löscht nun diese Nachricht und schickt dem empfänger nochmal eine Nachricht, das er die Nachricht "veröffentlichen" darf, also das das Programm sie Mitgeteilt bekommt. Falls diese Nachricht nicht ankommen sollte, wird die nachricht sonst automatisch nach 1000ms angezeigt (kann man ändern ). Auch schickt der Empfänger, bekommt er keine Antwort, die Nachricht nochmal los (nach 64ms -> auch änderbar). Wurde die nachricht 3 mal gesendet, und immer noch keine Antwort vom Empfänger wird zum Schonen der ressaucen diese NAchricht verworfen, aber spätestens beim dritten mal sollte es zu 99.9999% ankommen.

Edit :
So dank DC's Tipp wurde jetzt das Sichere Senden beschleunigt. Dadurch dass jetzt keine Antowort mehr vom Sender kommen muss, ist jetzt alles Etwas schneller (auch wenn man es kaum merkt, aber ich denke bei riesigen Datenmengen merkt mans schon ). Auch ist die Zeit für die Nachricht zum wiederholten senden gestiegen, standartweise auf 512, sonst wenn ein Ping vorhanden ist dann Ping*2. Das heißt der Empfänger hat auf jeden fall genug zeit zu antworten, auch bei einem Ping über 64 ms.

mfg ToeB

Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6  Weiter