Netzwerk Libs

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

Worklogs Netzwerk Libs

SimpleUDP 3.0

Donnerstag, 21. April 2011 von ToeB
user posted image

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

Montag, 4. April 2011 von ToeB
user posted image

So es gibt wieder neues Very Happy

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 Wink

mfg ToeB

SimpleUDP 3.0 - Ports

Donnerstag, 31. März 2011 von ToeB
user posted image

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

Montag, 28. März 2011 von ToeB
user posted image

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%
[######----------]


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 Smile


mfg ToeB

SimpleUDP 3.0

Freitag, 25. März 2011 von ToeB
user posted image


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 Wink




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


mfg ToeB

SimpleUDP 3.0

Dienstag, 22. März 2011 von ToeB
user posted image

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


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

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 Very Happy) um mir eine ToDo-Liste zu erstellen. Ich habe jetzt alles eingetragen (die Features die bis jetzt geplant oder schon eingebaut sind), und das Programm spuckt mir den Fortschritt aus.

Zitat:
SimpleUDP 3.0 - 56%
[######---------]
Masterserver - 0%
[--------------------]


Bis zum nächsten Eintrag,

mfg ToeB

SimpleUDP 3.0

Freitag, 18. März 2011 von ToeB
user posted image

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 Very Happy) (Die Rates sind nicht ganz synchron, das liegt zum einen daran das sie niemals 100% synchron werden können und dass ich die Screenshots nacheinander gemacht habe) :
user posted image
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

Donnerstag, 17. März 2011 von ToeB
user posted image

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


(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

Mittwoch, 16. März 2011 von ToeB
user posted image

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 :
Arrow Ich habe in der Lib ein "Internet Protokoll" eingebaut, welches für das senden von Nachrichten da ist, bei denen Sicher gestellt wird, das diese auch ankommen. Dieses Protokoll verwende ich sowohl für das senden Lib-Interner Nachrichten (Connecten, Verlassen usw.) als auch Später für die Nachrichten vom "Benutzer" der Lib (Also dem Programmierer Very Happy )
Arrow Man kann schon einen Host erstellen /sich schon mit einem Host verbinden
Arrow Die fast Komplette Lib basiert auf Banks, dadurch habe ich viel mehr möglichkeiten, z.B. durch den Befehl "Writebytes" die Komplette Spielerliste zu senden. Außerdem muss man nicht wie bei den Types um über eine ID den Eintrag herauszufinden den Umweg über ein verlinktes Array gehen sondern hat mit der ID direkt den zugehörigen Speicherplatz der Daten. Ich werde mich allerdings hier auf das Speichern von IP und Port beschränken, Name z.B. sollte dann jeder Programmierer selber einprogrammieren (bietet Platz für mehr möglichkeiten)
Arrow Momentane Befehle :
Code: [AUSKLAPPEN]
CreateSession
SessionConnect
UpdateSession
(SendMsgEx)
CountClients
GetClientID
ClientIDUsed
GetClientIP
GetClientPort
(AddClient)
(IntIP)
(Die in Klammern stehen sind Befehle eigens für die Lib)

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

Dienstag, 25. Januar 2011 von ToeB
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

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