Netzwerk Libs
SimpleUDP 3.0


So, es geht wieder weiter. Nach einer Klausuren- und Schönwetter-Pause beginnt nun wieder schleppend die Entwicklung der SimpleUDP3.0. Diesmal keine neuen Nachrichten vom Masterserver, dessen GUI ich ohnehin nochmal neu schreiben muss, sondern eine andere wichtige Neuerung. Und zwar hat Dottakopf, welchem ich eine Alpha-Version der Lib gegeben habe für sein Projekt, mich mal angehauen ob nicht die Möglichkeit besteht, das der Client beim Joinen sowohl wichtige Informationen von seiner Seite schickt als auch von den anderen Clients empfängt. Das kann ich allerdings so einfach nicht Umsetzten, da sonst die Struktur und das "Simple" verloren geht. Also habe ich eine Funktion erstellt, die das erleichtern soll : UDP_WaitMsg. Zur Anwendung :
BlitzBasic: [AUSKLAPPEN]
UDP_SessionConnect( "127.0.0.1", 5000 ) ;Mit Session verbinden {IP, Port}
UDP_wString( "Hallo, ich bin ein Client !" ) ;Nachricht mit eigenen Daten schicken
Local tmpMsg.Msg = UDP_SendMsg( MSG_StartMsg, SENDTO_Host, SEND_Extend )
;Warten auf Verbindung mit dem Host und die Nachricht
While UDP_SessionConnected = False Or tmpMsg <> Null
UDP_UpdateSession( )
Delay 16
Wend
;Auf Nachricht vom Server warten mit den übrigen Client-Daten :
UDP_WaitMsg( Null, MSG_StartMsg ) ;(Null gibt an, dass nicht auf eine gesendete Nachricht gewartet werden muss,
;sondern auf den Header [MSG_StartMsg].
DebugLog UDP_rString( )
mfg ToeB
SimpleUDP 3.0


So es gibt wieder neues

Man kann jetzt, beim starten eines Spieles, den Server Hochladen. Man kann auch schon Server suchen, allerdings nur die vom Masterserver aus. Außerdem ist noch ein kleines geheimes Sicherheitssystem eingebaut, damit man nicht, wenn man die Ticket-ID besitzt, einfach so Server hochladen / löschen oder Spieler erstellen / löschen kann. Dieses Sicherheitssytem läuft kommplet Server seitig, kann also nicht vom User manipuliert werden.
Das wars auch schon wieder, bis zum nächsten Eintrag

mfg ToeB
SimpleUDP 3.0 - Ports


Es gibt wieder was neues !
Man kann sich jetzt nämlich mit dem Masterserver verbinden. Dazu muss man seine Daten über eine Funktion (Spielname/Passwort) an den Server senden und dann krigt man ein Ticket. Mit diesem Ticket kann (könnte) man nun einen Server hochladen, die Daten von diesem Verändern oder ihn wieder Löschen. Auch kann (könnte) man darüber Online Spieler Registrieren, sich mit einem Einloggen, sich wieder Ausloggen oder ihn wieder Löschen.
Auch gibt es beim Masterserver eine art Port-Verteilung. Das heißt, es wird auf einen Standard-Port verbunden, und dann sucht sich der Server den Port mit den Wenigsten Verbindungen raus und schickt dem Clienten diesen zu. Das ganze soll dazu führen dass Daten nicht durch einander kommen oder es zu lange dauert bis Daten ankommen.
mfg ToeB
SimpleUDP 3.0 - Masterserver


So, ich habe, wie angekündigt, mit dem Masterserver in BPlus begonnen. Mittlerweile kann er schon Spiele hinzufügen bzw. Server an die Serverliste hängen und wieder löschen. Das ganze wird nicht im RAM gespeichert, sondern in Dateien, von diesen holt sich das der Server die nötigen Informationen.
Auch verschwindet das Server-fenster in der Tray-Leiste von Windows, wenn man es minimiert, dann nimmt es weniger "Platz" weg auf dem Desktop und kann so fast vollständig im Hintergrund laufen.
Fortschritt :
Zitat:
SimpleUDP 3.0 - 72%
[#######--------]
Masterserver - 58%
[######----------]
[#######--------]
Masterserver - 58%
[######----------]
Als nächstes werden die Onlinespieler eingerichtet, dann kommt das verbinden mit der SimpleUDP3.0 .
Wenn alles gut läuft, sollte ich in 1 oder 2 Wochen fertig sein

mfg ToeB
SimpleUDP 3.0


ChangeHost
So, nun ist auch die ChangeHost-Funktion eingebaut. Damit kann der Host gewechselt werden während der Sitzung. Man gibt einfach die ID des Spielers an, welcher der neue Host werden soll und schwupps, wird gewechselt. In der Globalen "ChangingHost" wird angegeben, ob sich das Programm grade im "Wechseln"-Modus befindet oder nicht..
Edit : Es gibt jetzt Ping-TimeOut, außerdem kann man auch eine IP Angeben in der Lib, die gebannt ist also die nicht auf den Server darf.
Edit 2 : Noch ein Nachtrag, die SimpleUDP 3.0 Steht ! Jetzt mach ich mich an den Masterserver und so ran.. Aber sollte auch nicht allzu lange dauern

Zitat:
SimpleUDP 3.0 - 72%
[#######--------]
Masterserver - 0%
[--------------------]
[#######--------]
Masterserver - 0%
[--------------------]
mfg ToeB
SimpleUDP 3.0


So, es gibt wieder ein paar Neuigkeiten. Zwar wird sich die Entwicklung hier einige Tage verzögern, da ich im Moment Klausur-Phase in der Schule habe und jetzt eine nach der anderen geschrieben werden muss - aber hier erstmal mein Fortschritt bis jetzt; ich habe Events und die Funktion KickClient eingebaut. Folgende Events gibt es bereits :
Code: [AUSKLAPPEN]
EVENT_NewClient
EVENT_ClientLeft
EVENT_ClientKicked
EVENT_Connected
EVENT_CantConnect
EVENT_ClientLeft
EVENT_ClientKicked
EVENT_Connected
EVENT_CantConnect
Diese werden alle in der Reihenfolge, in der sie aufgetreten sind, zurückgegeben mit diesem Befehl :
Code: [AUSKLAPPEN]
eventData$ = GetEvent( )
Zusätztliche Daten des Events kann man aus den Globalen
Code: [AUSKLAPPEN]
GetEventSource
GetEventData
GetEventInfo
GetEventData
GetEventInfo
herausfinden. Source gibt immer die Client-ID an, um welchen Client das Event sich dreht, bei EventData wird eines der oben genannten Events gespeichert un EventInfo ist eine zusätzliche Info, falls eine benötigt wird.
Außerdem kann man mit KickClient( ID ) einen Spieler kicken.
Desweiteren benutze ich seit gestern das schöne Tool "Step One" von Holzchopf (sehr schönes Tool

Zitat:
SimpleUDP 3.0 - 56%
[######---------]
Masterserver - 0%
[--------------------]
[######---------]
Masterserver - 0%
[--------------------]
Bis zum nächsten Eintrag,
mfg ToeB
SimpleUDP 3.0


Und es gibt schon wieder eine (kleine) Neuigkeit. Ich habe das Senden und Empfangen eingebaut so wie Download und Upload-Rates (Angaben in Bytes pro Frame). So Sieht das ganze dann mit 3 Clients aus, die sich untereinander die Maus-Positionen schicken (Ihr kennt das Beispiel sicher aus den SimpleUDP2-Beispielen

Oben(Rot) -> Download, Unten(Grün) -> Upload
So sieht der Code dafür aus :
BlitzBasic: [AUSKLAPPEN]
Include "Include\SimpleUDP3.bb"
Graphics 400, 300, 32, 2
SetBuffer BackBuffer( )
Local timer = CreateTimer( 60 )
Local updateClientMs = MilliSecs( ), clientCount
Local i, tmpID, ms, reDim
Dim p_Mx( 0 ), p_My( 0 )
Local choose
Print "1 - Host"
Print "2 - Join to Host"
Repeat
If KeyHit( 1 ) Then End
If KeyHit( 2 ) Then choose = 1
If KeyHit( 3 ) Then choose = 2
Delay 10
Until choose
If choose = 1 Then
CreateSession( 16, NETSESSION, 5000 )
Dim p_Mx( MaxClients ), p_My( MaxClients )
ElseIf choose = 2
SessionConnect( "127.0.0.1", 5000 )
EndIf
Dim Stats#( 99, 1 )
Const MaxRate# = 300.0
Repeat
ms = MilliSecs( )
UpdateSession( )
ms = MilliSecs( ) - ms
If reDim = 0 And SessionHost = 0 And SessionConnected = True Then
reDim = 1
Dim p_Mx( MaxClients ), p_My( MaxClients )
EndIf
If SessionHost = 1 Then Text 0, 0, "Session : Host"
If SessionHost = 0 Then Text 0, 0, "Session : Client ("+ClientID+")"
If updateClientMs <= MilliSecs( ) Then
clientCount = CountClients( )
updateClientMs = MilliSecs( ) + 000
EndIf
p_Mx( ClientID ) = MouseX( )
p_My( ClientID ) = MouseY( )
wInt( p_Mx( ClientID ) )
wInt( p_My( ClientID ) )
SendMsg( SENDTO_All, SEND_Normal )
While RecvMsg( )
tmpID = MsgFromID( )
p_Mx( tmpID ) = rInt( )
p_My( tmpID ) = rInt( )
Wend
AddStats( )
If clientCount > 0 Then
For i = 1 To clientCount
tmpID = GetClientID( i )
Text 0, i*13,i+".: "+DottedIP( GetClientIP( tmpID ) )+":"+GetClientPort( tmpID ) +" ("+GetClientPing( tmpID )+"ms)"
Oval p_Mx( tmpID )-4, p_My( tmpID )-4, 9, 9, 0
Next
EndIf
For i = 0 To 99
Color 255, 0 ,0 : Rect 301+i, 200, 1, Stats( i, 0 )/MaxRate*50.0, 1
Color 0, 255, 0 : Rect 301+i, 300-Stats( i, 1 )/MaxRate*50.0, 1, Stats( i, 1 )/MaxRate*50.0, 1
Next
Color 255, 255, 255
Text 140, 200, "Download : "+DownloadRate+" Bytes"
Text 140, 287, " Upload : "+UploadRate +" Bytes"
Text 0, 200, hD + ", "+hU
If DownloadRate > 22 Then hD = DownloadRate
If UploadRate > 22 Then hU = UploadRate
If KeyHit( 57 ) Then
For i = 0 To 99
DebugLog Stats( i, 0 )+", "+Stats( i, 1 )
Next
EndIf
WaitTimer( timer )
Flip 0
Cls
Until KeyHit( 1 )
EndSession( )
End
Function AddStats( )
Local i
For i = 0 To 98
If DownloadRate > 0 Then Stats( i, 0 ) = Stats( i+1, 0 )
If UploadRate > 0 Then Stats( i, 1 ) = Stats( i+1, 1 )
Next
If DownloadRate > 0 Then Stats( 99, 0 ) = DownloadRate
If UploadRate > 0 Then Stats( 99, 1 ) = UploadRate
End Function
Man kann also ganz gewohnt Bytes / Ints / FLoats oder was auch immer hintereinander Schreiben und dann einfach absenden. Auslesen dann auch in der Reihenfolge.
mfg ToeB
SimpleUDP 3.0


So, nun ist auch das Verlassen des Hostes und das Abfragen des Pings drin. Und durch mein gesichertes Senden kommen alle nachrichten so an, wie sie sollen.
Als nächstes bau ich erstmal das Benutzerdifinierte senden sein, es wird so ausehen :
Code: [AUSKLAPPEN]
wByte( 12 )
wShort( 2039 )
wInt( 33489 )
wString( "Hallo" )
wLine( "Tag" )
wBank( testbank )
wFile( DatStream, 100 )
SendMsg( SEND_ALL, True ) ;An alle + Abgesichert
wShort( 2039 )
wInt( 33489 )
wString( "Hallo" )
wLine( "Tag" )
wBank( testbank )
wFile( DatStream, 100 )
SendMsg( SEND_ALL, True ) ;An alle + Abgesichert
(Intern wird es über eine Bank geregelt). Kann sich aber noch einiges ändern, ist nur mein Entwurf bis jetzt. Ich find es nämlich unötig verschwendete Leistung, wie in der SimpleUDP 2.0 erst einen String parsen zu müssen und dann erst senden zu können, hierbei hat man individuelle Möglichkeiten, den Aufbau der Nachrichten zu strukturieren. Allerdings muss man beachten, dass man nur etwa 8192 Bytes senden kann in eine UDP-Nachricht, und der Header meines "Moduls" nimmt davon 12 Bytes ein, also etwa 8180 Bytes die man senden könnte. Sollte reichen, aber vor allem bei dem Befehl "wBank" und "wFile", die ganze Byte blöcke senden, ist es wichtig, darauf zu achten das diese Blöcke nicht größer werden als diese Größe, sonst wird die Nachricht einfach nicht gesendet :/
mfg ToeB
SimpleUDP 3.0


So, ich habe jetzt beschlossen die SimpleUDP nun zum dritten Mal komplett neu zu schreiben. Das wäre dann Version 3.0. Ich war zum einen an machen Stellen ziemlich unzufrieden wie die SimpleUDP 2.0 lief, außerdem war mit der Struktur viele Ausbauten gar nicht möglich. Auch fand ich den Masterserver zu "einfach" programmiert, viel zu unsauber und viel zu wenig Platz für erweiterungen. Deswegen werde ich dabei noch einen Masterserver entwickeln, der sowohl Leistungstark als auch auf jedem X Beliebigen Computer zum laufen gebracht werden kann, um z.B die Serverlisten für eigene Spiele auf einem eigenen Server zu Hosten.
Angefangen habe ich heute morgen / Mittag und bin doch recht weit gekommen. Die Lib umfasst nun ganze 287 Zeilen die es aber in sich haben :





Code: [AUSKLAPPEN]
CreateSession
SessionConnect
UpdateSession
(SendMsgEx)
CountClients
GetClientID
ClientIDUsed
GetClientIP
GetClientPort
(AddClient)
(IntIP)
(Die in Klammern stehen sind Befehle eigens für die Lib)
SessionConnect
UpdateSession
(SendMsgEx)
CountClients
GetClientID
ClientIDUsed
GetClientIP
GetClientPort
(AddClient)
(IntIP)
So sieht im moment dann ein Beispiel Programm aus :
BlitzBasic: [AUSKLAPPEN]
Include "Include\SimpleUDP3.bb"
Graphics 400, 300, 32, 2
SetBuffer BackBuffer( )
Local timer = CreateTimer( 50 )
Local updateClientMs = MilliSecs( ), clientCount
Local i, tmpID
Local choose
Print "1 - Host"
Print "2 - Join to Host"
Repeat
If KeyHit( 1 ) Then End
If KeyHit( 2 ) Then choose = 1
If KeyHit( 3 ) Then choose = 2
Until choose
If choose = 1 Then
CreateSession( 16, NETSESSION, 5000 )
ElseIf choose = 2
SessionConnect( "127.0.0.1", 5000 )
EndIf
Repeat
UpdateSession( )
If SessionHost = 1 Then Text 0, 0, "Session : Host"
If SessionHost = 0 Then Text 0, 0, "Session : Client ("+ClientID+")"
If updateClientMs <= MilliSecs( ) Then
clientCount = CountClients( )
updateClientMs = MilliSecs( ) + 000
EndIf
If clientCount > 0 Then
For i = 1 To clientCount
tmpID = GetClientID( i )
Text 0, i*13,i+".: "+DottedIP( GetClientIP( tmpID ) )+":"+GetClientPort( tmpID )
Next
EndIf
WaitTimer( timer )
Flip 0
Cls
Until KeyHit( 1 )
End
Der Programmtext sollte glaub ich auch ohne es zu testen klar sein ;D
mfg ToeB
Back to the roots

So. Der Masterserver war schon für die Serverlisten einsatzbereit, und was kommt dazwischen ? Natürlich, eine Formatierung. Die wurde allerdings ohne mein Wissen von Ubuntu bei der Installation eingeleitet obwohl ich ausdrücklich gesagt habe das er Ubuntu neben Windows installieren soll. Ich werde mir jetzt erstmal meine alte XP Version drauf spielen (hatte vorher Vista, muss aber beim Hersteller die CD beantragen), dann werde ich den Masterserver nochmal neu schreiben (zwangsläufig). Hab auch schon eine Idee wie ich die UI anders Gestalte aber dazu mehr später. Glück im Unglück hatte ich allerdings, die vielen vielen Programme die ich geschrieben habe hatte ich vorgestern mir auf die externe Festplatte gepackt, somit ist eigl. nur der Masterserver betroffen (immerhin waren es schon 1500 Zeilen oO)
So das wars auch schon wieder, ich geh jetzt schmollen und ubuntu verfluchen,
mfg ToeB
So das wars auch schon wieder, ich geh jetzt schmollen und ubuntu verfluchen,
mfg ToeB
Gehe zu Seite Zurück 1, 2, 3, 4, 5, 6 Weiter