[UDP]WriteByte Daten von 1 Clienten werden nur Aktualisiert

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Bobo2040

Betreff: [UDP]WriteByte Daten von 1 Clienten werden nur Aktualisiert

BeitragDo, Feb 13, 2014 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Very Happy
Ich habe nen Problem und zwar soll der Server nachdem eine Verbindungsanfrage kam die Daten an die Clienten verteilen >.> Klappt Prima!
Aber um zu Verhindern das ein User permanent Online ist, falls die UDP Verbindung nicht richtig beendet wurde will ich, das er User von denen er 5Sek keine Nachricht bekam Löscht... klappt auch aber ich mache das mit ReadByte also der CLient sendet Writebyte udpStream,5
Und seine anderen Daten ... der Server, liest falls er Writebyte udpStream.5 bekommen hat die Daten die Hinterhergeschickt wurden aus klappt auch Daten werden Aktualisiert... jetzt zum Problem er Aktualisiert sie nur von einem Clienten und zwar dem der als erstes eingeloggt war...
Zur überprüfung von wem die Msg kam nehme ich
If info\name$=ReadLine(udpStream) Then
falls das True ist dann soll er die Daten aktualisieren aber irgendwie Aktualisiert er Sie nur beim ersten Clienten und nicht beim 2. oder 3. etc.
Ich weiß nicht warum kann UDP nicht "gleichzeitig" oder in einer "warteschlange" die Daten die gesendet wurden auslesen ? Das er zuerst User1 dann User2 dann User3... abarbeitet ?
Jeder Client hat nen anderen Port der zufällig ausgewählt wird von UDP habe schon überprüft das keiner den Selben Port o.ä. hat...
Naja hier mal der Server:
BlitzBasic: [AUSKLAPPEN]

Type Client
Field ip%
Field dip%
Field port%
Field name$
Field x_coor%
Field y_coor%
Field map%
Field rang%
Field inlog$
Field damage%
Field ship_rotation%
Field hitpoints%
Field shield%
Field lastMsg%
End Type


Global ServerPort=6354
Global udpStream=CreateUDPStream(ServerPort)

Print "Versuche Server zu starten..."

If Not udpStream Then
Print "Server Timeout please choose another Port and retry"
EndIf

Print "Server gestartet!"

Repeat

RecvMsg()
ShareData()
;RefreshData()
DeleteUser()
Delay 1024

Until KeyHit(1)

;###### Funktionen ######
Function RecvMsg() ;Empfängt die Nachrichten und verarbeitet sie :3
Local ipRecv=RecvUDPMsg(udpStream) ; Die IP wird ausgelesen
If ipRecv=0 Then Return ; Falls keine Message ankam

Local portRecv=UDPMsgPort(udpStream) ; Der Port wird ausgelesen
Local handler=ReadByte(udpStream) ; List aus was der Client will

;### Case 1 -> Will Beitreten
;### Case 2 -> Sendet Koordinaten und weitere Daten (Hp,Sh,x,y,dmg,rang)
;### Case 3 -> Verlässt den Raum
Select handler
Case 1
Local client.Client=New Client ; Neuer Client wird erstellt

client\ip%=ipRecv ; Die Client IP
client\dip%=DottedIP(ipRecv) ; Sieht schöner aus -> 127.0.0.1 z.b.
client\port%=portRecv ; Port abspeichern
client\name$=ReadLine(udpStream) ; Username
client\x_coor%=ReadInt(udpStream) ; x Koordinaten
client\y_coor%=ReadInt(udpStream) ; y Koordinaten
client\map%=ReadInt(udpStream) ; Map
client\rang%=ReadInt(udpStream) ; Rang Colonell Captain etc
client\inlog%=ReadLine(udpStream) ; wen er im Log hat
client\damage%=ReadInt(udpStream) ; Wie viel Schaden macht er gerade?
client\ship_rotation%=ReadInt(udpStream) ; wie ist sein schiff gedreht
client\hitpoints%=ReadInt(udpStream) ; Hitpoints
client\shield%=ReadInt(udpStream) ; Schilde
client\lastMsg%=MilliSecs()+5000

;#### Allgemeine Daten ausgeben

Print "* "+client\name$+" hat sich von "+client\dip%+":"+client\port%+" eingeloggt *"
Print "Daten:"
Print "Username:"+client\name$
Print "Koordinaten (x/y):"+client\x_coor%+" "+client\y_coor%
Print "Standort (Map):"+client\map%
Print "Rang:"+client\rang%
Print "Logbuch:"+client\inlog$
Print "Schaden:"+client\damage%
Print "Schiff drehung:"+client\ship_rotation%
Print "Hitpoints:"+client\hitpoints%
Print "Schild:"+client\shield%
;### Daten ausgabe Ende

;Erlaubniss erteilen
WriteByte(udpStream,1)
;Nachricht absenden
SendUDPMsg(udpStream,client\ip%,client\port%)
Print "Erlaubniss erteilt!\"

Print "Neuer User wird gespeichert.."
For s_client.Client=Each Client
If s_client\name$=client\name$ Then

Else
WriteByte udpStream,2
WriteInt udpStream,client\ip% ; Ip
WriteInt udpStream,client\port% ; Port
WriteLine udpStream,client\name$ ; Username
WriteInt udpStream,client\x_coor% ; X koordinaten
WriteInt udpStream,client\y_coor% ; Y koordinaten
WriteInt udpStream,client\map% ; Map
WriteInt udpStream,client\rang% ; Rang
WriteLine udpStream,client\inlog$ ; Logbuch
WriteInt udpStream,client\damage% ; Schaden
WriteInt udpStream,client\ship_rotation% ; Schiff drehung
WriteInt udpStream,client\hitpoints% ; Hitpoints
WriteInt udpStream,client\shield% ; Schild
;Daten senden
SendUDPMsg udpStream,s_client\ip%,s_client\port%
Print "Daten versendet.."
EndIf
Next
Case 5

Print "Incomming Message..."
For client.Client=Each Client
If client\name$=ReadLine(udpStream) Then

client\x_coor%=ReadInt(udpStream)
client\y_coor%=ReadInt(udpStream)
client\map%=ReadInt(udpStream)
client\rang%=ReadInt(udpStream)
client\inlog$=ReadLine(udpStream)
client\damage%=ReadInt(udpStream)
client\ship_rotation%=ReadInt(udpStream)
client\hitpoints%=ReadInt(udpStream)
client\shield%=ReadInt(udpStream)
client\lastMsg%=MilliSecs()+5000
Print client\name$+" - RefreshData()"
; Print client\x_coor%

EndIf
Next

End Select
handler=0
End Function


Function ShareData()
;Alte Daten an neuen User senden :3
For client.Client=Each Client
For s_client.Client=Each Client

If s_client\name$=client\name$ Then
Print "Nicht versendet an "+s_client\name$+" - "+client\name$
Else
;Print "User werden Informiert..."
WriteByte udpStream,2
WriteInt udpStream,s_client\ip% ; Ip
WriteInt udpStream,s_client\port% ; Port
WriteLine udpStream,s_client\name$ ; Username
WriteInt udpStream,s_client\x_coor% ; X koordinaten
WriteInt udpStream,s_client\y_coor% ; Y koordinaten
WriteInt udpStream,s_client\map% ; Map
WriteInt udpStream,s_client\rang% ; Rang
WriteLine udpStream,s_client\inlog$ ; Logbuch
WriteInt udpStream,s_client\damage% ; Schaden
WriteInt udpStream,s_client\ship_rotation% ; Schiff drehung
WriteInt udpStream,s_client\hitpoints% ; Hitpoints
WriteInt udpStream,s_client\shield% ; Schild
;Daten senden
SendUDPMsg udpStream,client\ip%,client\port%
Print s_client\ip%+" > "+s_client\port%+" > "+s_client\name$
;Print "Daten versendet.."
EndIf

Next
Next
End Function

Function RefreshData()
;Daten der User aktialisieren
;Print "Werden Aktualisiert..."
Byte = ReadByte(udpStream)
If Byte=5 Then
Print "Incomming Message..."
For client.Client=Each Client
If client\name$=ReadLine(udpStream) Then

client\x_coor%=ReadInt(udpStream)
client\y_coor%=ReadInt(udpStream)
client\map%=ReadInt(udpStream)
client\rang%=ReadInt(udpStream)
client\inlog$=ReadLine(udpStream)
client\damage%=ReadInt(udpStream)
client\ship_rotation%=ReadInt(udpStream)
client\hitpoints%=ReadInt(udpStream)
client\shield%=ReadInt(udpStream)
client\lastMsg%=MilliSecs()+5000
Print client\name$+" - RefreshData()"

EndIf
Next
EndIf
End Function

Function DeleteUser()
;Zum löschen Inaktiver User
For client.Client=Each Client
If client\lastMsg%<MilliSecs() Then
Print client\name$+" hat den Raum verlassen [Request Timeout]"
Delete client.Client
EndIf
Next
End Function


Client:
BlitzBasic: [AUSKLAPPEN]

;Client
Type Enemies
Field ip%
Field port%
Field username$
Field x_coor%
Field y_coor%
Field map%
Field rang%
Field inlog$
Field damage%
Field ship_rotation%
Field hitpoints%
Field shield%
End Type

Global x_coor%=100
Global y_coor%=250
Global map%=2
Global rang%=1
Global inlog$="Bobo2040"
Global damage%=25000
Global ship_rotation%=1
Global hitpoints%=306000
Global shield%=262000

Global server_port=6354
Global server_ip=INT_IP("127.0.0.1")
Global udpStream=CreateUDPStream()

If Not udpStream Then
Print "Verbindung fehlgeschlagen.."
EndIf

Print "Suche nach Server..."
Print "Server gefunden..."
Print "Server anfrage gestartet!"

Global username$=Input("Username:")

WriteByte udpStream,1 ; Frage ob erlaubnis erteilt wird
Print "Versuche zu verbinden"
WriteLine udpStream,username$
WriteInt udpStream,x_coor%
WriteInt udpStream,y_coor%
WriteInt udpStream,map%
WriteInt udpStream,rang%
WriteLine udpStream,inlog$
WriteInt udpStream,damage%
WriteInt udpStream,ship_rotation%
WriteInt udpStream,hitpoints%
WriteInt udpStream,shield%
;Daten an Server senden
SendUDPMsg udpStream,server_ip,server_port

Print "Warte auf Server antwort"



;###### Hauptschleife ######
Repeat
Client()
RefreshData()
;inlog$="Bernd"+Rand(1,100)
;Username ausgeben
For s_enemie.Enemies=Each Enemies
Print s_enemie\username$
Next

Delay 2048
Until KeyHit(1)



;###### Funktionen ######
Function Client()
Local ipRecv=RecvUDPMsg(udpStream) ; UDP Nachricht abrufen
If ipRecv=0 Then Return ; Falls nichts kam -> Return

Local portRecv=UDPMsgPort(udpStream) ; Port abspeichern

If ipRecv<>server_ip Or portRecv<>server_port Then Print "Hacked"
;handler holen
Local handler=ReadByte(udpStream)
Select handler
Case 1 ; Erlaubnis vom Server bekommen
Print "Server hat Anfrage bearbeitet.."
Print "Du bist nun eingeloggt!"

Case 2 ; Daten von NEUEN nutzern werden gespeichert
oC_ip%=ReadInt(udpStream)
oC_prot%=ReadInt(udpStream)
oC_username$=ReadLine(udpStream)
oC_coor_x%=ReadInt(udpStream)
oC_coor_y%=ReadInt(udpStream)
oC_map%=ReadInt(udpStream)
oC_rang%=ReadInt(udpStream)
oC_inlog$=ReadLine(udpStream)
oC_damage%=ReadLine(udpStream)
oC_ship_rotation%=ReadInt(udpStream)
oC_hitpoints%=ReadInt(udpStream)
oC_shield%=ReadInt(udpStream)

For checkEnemie.Enemies=Each Enemies
If checkEnemie\username$=oC_username$ Then
Update=0
Else
Update=1
EndIf
Next

If Update=1 Then
enemie.Enemies=New Enemies ; Neuer Feind wird erstellt

enemie\ip%=oC_ip
enemie\port%=oC_port
enemie\username$=oC_username$
enemie\x_coor%=oC_coor_x
enemie\y_coor%=oC_coor_y
enemie\map%=oC_map
enemie\rang%=oC_rang
enemie\inlog$=oC_inlog
enemie\damage%=oC_damage
enemie\ship_rotation%=oC_ship_rotation
enemie\hitpoints%=oC_hitpoints
enemie\shield%=oC_shield
EndIf
Case 3 ;Daten abspielen
For s_enemie.Enemies=Each Enemies
Print s_enemie\username$
Next

End Select

End Function

;Ip umwandeln
Function INT_IP(IP$) ; DottedIP to IntIP
a1 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
a2 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
a3 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
a4 = Int(IP$)
Return (a1 Shl 24) + (a2 Shl 16) + (a3 Shl 8 ) + a4
End Function

;Permanent daten Aktualisieren
Function RefreshData()
WriteByte udpStream,5 ; Sagen das es aktualisiert werden soll
;Print "Daten aktualisierungsanfrage wird gesendet.."
WriteLine udpStream,username$
WriteInt udpStream,x_coor%
WriteInt udpStream,y_coor%
WriteInt udpStream,map%
WriteInt udpStream,rang%
WriteLine udpStream,inlog$
WriteInt udpStream,damage%
WriteInt udpStream,ship_rotation%
WriteInt udpStream,hitpoints%
WriteInt udpStream,shield%
SendUDPMsg udpStream,server_ip,server_port
End Function
WaitKey

ZEVS

BeitragDo, Feb 13, 2014 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Problem ist folgendes: In der Hauptschleife BlitzBasic: [AUSKLAPPEN]
Repeat 

RecvMsg()
ShareData()
;RefreshData()
DeleteUser()
Delay 1024

Until KeyHit(1)

(btw. von Delay solltest du möglichst die Finger lassen, siehe https://www.blitzforum.de/foru...hp?t=25242)

wird ungefähr einmal pro Sekunde die Funktion RecvMsg aufgerufen. Diese schaut aber nur nach der ersten Nachricht. BlitzBasic: [AUSKLAPPEN]
Function RecvMsg() ;Empfängt die Nachrichten und verarbeitet sie :3
Local ipRecv=RecvUDPMsg(udpStream) ; Die IP wird ausgelesen
If ipRecv=0 Then Return ; Falls keine Message ankam
; ...
End Function

Wenn sie nach allen Nachrichten schauen soll, musst du diese in einer Schleife verarbeiten:
BlitzBasic: [AUSKLAPPEN]
Function RecvMsg()
Repeat
Local ipRecv=RecvUDPMsg(udpStream) ; Die IP wird ausgelesen
If ipRecv=0 Then Return ; Falls keine Message ankam
; ...
Forever
End Function

ZEVS
 

Bobo2040

BeitragDo, Feb 13, 2014 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe es probiert und es geht leider immernochtnicht...
Und ich weiß das ein Timer besser ist Very Happy
Ich habe Delay nur zu testzwecken drinne Wink
Mfg

Dottakopf

BeitragDo, Feb 13, 2014 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
also.

lass das delay verwende es nie wieder um irgendwie etwas zu stoppen oder zu verlangsamen. Evil or Very Mad
Das problem dabei ist das es wirklich das programm anhält.. das willst du aber zu keinem zeitpunt Exclamation

nutze dafür einen ganz normalen timer...

Code: [AUSKLAPPEN]

Global Game_Timer = createtimer(60)



Code: [AUSKLAPPEN]

;main loop mit verzögerung...
while not keyhit(1)
cls
waittimer(Game_timer)


flip 0 ; immer flip 0 !.. hast ja jetzt einen game timer
wend


Mir ist schon klar warum du mit delay arbeitetst.. du hast nicht verstanden wie debugging funktioniert.
Also.. Schau dir den befehl debuglog an..

erstelle ein neues programm, und schreibe:
i = 10
debuglog "Wert" + i
i = i +10
debuglog "Wert neu " + i

starte das programm im Debugmodus.. und wärend das programm noch offen ist, kannst du hinten in der IDE auf Debuglog klicken... Da ist so ein reiter... und da wird in echtzeit "mitgeloggt".

Nun wirst du überall schön debuglog in deine Software einbauen.. und beginnst bitte damit sauber dein programm während es läuft zu debuggen. Dann wirst du auch ganz schnell finden wo der fehler ist.

Meine erste vermutung aus dem Bauchraus ist, dass du irgendwo den stream nicht vollständig ausliest oder schlichtweg 0er sendest. (Nutze debuglog und lasse dir in echtzeit anzeigen was ausgegeben wird)


bitte entschuldigt meinen plumpen schreibstil, ist nich böse gemeint.

~Achja.. stürzt ein programm mit nem MAV ab.. kannst totzdem in der Debuglog nachgucken in welcher zeile das programm abkackt.~


du schreibst "ich habe es probiert".. bitte gebe uns eine zeile code.. in der wir sehen können was du da probiert hast. Gerne auch mit deinen Gedanken gängen, so lenste am ehesten weil dich leute auf einen fehler ansprechen.

~Noch ein Tipp~ willst du sever und client gleichzeitig debugen .. musst du blitz 2 mal starten. Und jeweils das programm im debugmodus starten.
Achte darauf das das Server Fenster und client fenster sich nicht überlappen. Führt zumindest bei mir zu bugs.. Sprich es aktualisiert die fenster nicht..
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

Bobo2040

BeitragDo, Feb 13, 2014 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay Debugmodus ist bei mir permanent an falls es ben Error gibt weis ich dann immer direkt in welcher Zeile Smile
Aber auf die Idee mit alles mitloggen und schauen wo er sendet/empfängt bin ich nicht gekommen Smile
Das mit ich habe es probiert war von dem was er gelistet hat das ich in der Funktion eine repeat ... Forever Schleife aufrufen
Sollte damit er das perma durchsucht Smile
Bin grad nicht am PC sondern am tablet nochmal zum delay wenn delay warten lässt werden dann trz noch UDP Daten empfangen ? Oder ist der Server dann im Prinzip offline für die 1 Sekunde ?
Benutze normal auch timer aber hier wollte ich zum testen erstmal delay nehmen damit ich schnell und ziemlich genau von MS her die Wartezeit einstellen kann.... Dachte das delay nicht benutzt werden sollte Wells veraltet ist und die CPU 100% auslastet >.> stört mich bei solchen Testzwecken eig. Am wenigsten wenn der Rest nicht klappt Smile
Naja ich probiere es heute abend oder morgen früh mal

PS: Der Code kann so 1:1 kopiert werden vllt. Liegts bei mir ja am Betriebssystem wäre nett wenn einer das bei sich mal
Testen kann

Mfg

EDIT:
Okay habe jetzt Timer gändert an Delay lags schonmal nicht Very Happy
Er sendet bei beiden Clienten die Daten richtig ab aber aus irgendeinem Grund
verarbeitet er nur die Daten vom zuerst eingeloggten...:/
EDIT2:
Kann ich irgendwie überprüfen ob der Stream versendet wurde ?
weil sendet=Sendudpmsg....
geht nicht hätte sonst sendet auf True oder False überprüft im Internet hab ich bissher
noch nix dazu gefunden...:/

DAK

BeitragDo, Feb 13, 2014 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
@Bobo: Die meisten Leute hier haben ihren eigenen Code zu debuggen. Debuggen ist der Hauptteil des Programmierens. Mal schnell sich was ausdenken und in nicht-funktionierendem Code hinklatschen ist keine Kunst. Das Debuggen und den Code zum Laufen kriegen ist die wirkliche Arbeit. Was Dottakopf da schreibt ist die Hälfte des Debuggens: sich überall alles loggen lassen, was irgendwie mit dem Problem zusammenhängen könnte.
Die andere Hälfte hängt mit dem Stop-Befehl zusammen. Stop pausiert das Programm an der Stelle wo Stop steht und übergibt die Kontrolle dem Debugger. Dort kannst du dann Befehl für Befehl durch den Code gehen und dir Live anzeigen lassen, was sich in jeder Variable befindet. Bist du damit fertig kannst du das Programm dann auf einen Klick im Debugger wieder weiterlaufen lassen.

Weißt du, sich generelle Anregungen und Hilfe holen ist voll ok. Sich spezielle Hilfe zum Code holen geht grad noch. Andere Leute darum bitten dein Programm auszuführen und zu debuggen ist anderen Leuten deine eigene Arbeit aufdrängen. Entweder du willst programmieren (das inkludiert debuggen, Dokumentationen und Tutorials wälzen und viel googlen) oder du willst es nicht. Tu es, oder lass es. Aber mach nicht den interessanten Teil (grundlegende Programmstruktur hinklatschen) und dräng die Drecksarbeit den Anderen auf.
Falls du das willst steht mein ursprüngliches Angebot immer noch. €40 die Stunde und ich schreibe/debugge dir deine Programme.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Bobo2040

BeitragDo, Feb 13, 2014 23:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ne danke DAK
ich hab ja nicht gemeint das sies Debugen sollen ...
Nur ka benutze WinXp und das hat gernmal seine Macken Wink
Der Server ist bei mir auch Kack Lam mitm Verbinden bei nem Kumpel dauert das Verbinden
zum Server und auf Antwort warten max. 1-2Sek bei mir gerne mal an die 20-30sek und habe keinen
EXTREM schlechte PC zwar nicht der beste aber 2GB Ram und 2,8Ghz CPU reicht dafür denke mal aus Very Happy
Naja ich probiers mal weiter ;D

Mfg

Dottakopf

BeitragDo, Feb 13, 2014 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
in beiden punkten muss ich DAK recht geben. Es klingt blöd aber der code ist bereits zu "komplex" als das man ihn hier 35 min genau durchchecken möchte und dann sicher sagen kann --> hier muss xYZU stehen.

nochmal... Exclamation Exclamation Exclamation Verwende nie... nie wieder das delay. Ja es ist so als wäre dein server für über 1 sek tot.

Der Timer verhindert das dein programm 10 0000 mal die sekunde die schleife durchläuft. Glaub mir das tut dem speicher nicht gut. Und das Programm funktioniert so auch nicht. Createtimer 60 lässt dein programm mit maximal 60 Frames(Durchgänge) pro Sekunde updaten.

Diese drosselung reicht fürs erste mal total aus....

sonst möchte ich dir folgende tipps geben.
- server startet..
- server horcht auf Port ob eine MSG kommt
- client startet
- client baut stream auf und sendet 1mal ein Hallo... (MSG=1)
- server lauscht und erhält ein "Hallo" (MSG=1)
- Server erstellt neuen spieler, Server antwortet dem client sofort mit einem Willkommen und den Informationen der bereits sich auf dem befinlichen Spieler
- Server Schreibt ein "neuer Spieler" an alle anderen bereits bestehenden Spieler(MSG=5)
- client ist nach senden "Hallo" (MSG=1) am lauschen und wartet auf ein Willkommen mit Infos des servers
- client laust solange bis Willkommen MSG=5 von server erhalten wurde oder Timeout(Prüfung durch Millisecs) erreicht wurde.


Programiere ein programm das erstmal nichts anderes als das macht. Ohne Delay.. oder sonstigen overhead.
Schreibe alles gleich als Writeline.. um zum testen zu vermeiden das du irgendwo eine byte schreibst aber ein "line" erwartest.
Schreibe ein "Debuglog" bei allen ereignissen auf du die wartest oder du die 1 mal verschickst..
es ist nicht korrekt wenn du in jedem schleifen durchgang ein Debuglog schreibst... (Spame nicht deine log zu)

wenn das funktioniert erweiterst du das programm... zum beispiel wenn ein spieler den server verlässt(MSG=99)

UDP verliert gerne mal ein packet. Sollstet du alles lokal auf einer maschine machen ist das extrem unwarscheinlich.
Trotzdem sollten die ersten Willkommens daten immer mit tcp übertragen werden. TCP ist verlustfrei


Es ist mir ein bisschen peinlich, aber ich bin in dieser old school netzwerk proggerei nicht mehr drin. Verwende nur noch die Netzwerklib Lama von Toeb die alles für einen Managed.

Versuche nicht die Lib zu laden und zu denken anschalten und funtzt. Die downloads der lib sind buggy !!
ich besitze eine funktionierende LAMA3(aktuell gibts nur die lama2) und einen eigenen Master server.

bekomm das zum laufen.. sende mir n funzendes beispiel und ich geb dir ne überarbeitete funktionierende LAMA Lib in der alles super easy ist.

.. toll nicht ? Cool
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

Bobo2040

BeitragDo, Feb 13, 2014 23:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Also soll ich NOCHMAL von neu anfangen ? ;D
Naja dann mach ichs mal so alles Schritt für Schritt neu ...
Ich verstehe diese Libs nicht hatte mal die SimpleUDP Lib probiert und nix verstanden was ich da machen
soll in PHP wenn ich da ne Lib nehme/schreibe dann in OOP und dann einfach die gewünschten Funtkionen
aufrufen aber die SimpleUDP lib habe ich nichtmal verstanden welche Funktion ich jetzt wo und wann brauche als ich se mir ne Stunde angeschaut habe xD
Unter ner Lib verstehe ich solche funktionen
CreateStream()
WaitForAnswer()
oder sowas halt und nicht
MasterServerIrgendwas()
Damit kann ich persönlich nix anfangen Very Happy
Lieber versuche ichs selbst zu schreiben anstatt das ich 3 Jahre brauche ne Lib zu verstehen
Very Happy
Mfg

PS: Nicht das die Lib schlecht ist nur ich komme damit nicht klar Very Happy
Allgemein mit Libs in B+ und BB nicht :/

Dottakopf

BeitragFr, Feb 14, 2014 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
ohne die lib würde ich nicht kein netzwerk projekt mehr starten.

genauso wie ich ohne die Draw3D nichtmal mehr mit bb proggen würde....
Hectic.. mein held Laughing
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

Bobo2040

BeitragFr, Feb 14, 2014 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Haha Smile
Würde ich die libs verstehen würde ich sie wahrscheinlich auch benutzen Very Happy
Mfg

BladeRunner

Moderator

BeitragFr, Feb 14, 2014 0:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Einarbeitungszeit gehört halt dazu.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DAK

BeitragFr, Feb 14, 2014 0:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Bobo2040 hat Folgendes geschrieben:
Ne danke DAK
ich hab ja nicht gemeint das sies Debugen sollen ...
Nur ka benutze WinXp und das hat gernmal seine Macken Wink
Der Server ist bei mir auch Kack Lam mitm Verbinden bei nem Kumpel dauert das Verbinden
zum Server und auf Antwort warten max. 1-2Sek bei mir gerne mal an die 20-30sek und habe keinen
EXTREM schlechte PC zwar nicht der beste aber 2GB Ram und 2,8Ghz CPU reicht dafür denke mal aus Very Happy
Naja ich probiers mal weiter ;D

Mfg


Nur zur Info: BlitzBasic wurde im September 2000 veröffentlicht. Wenn man bedenkt, dass Windows 2000 da gerade mal 10 Monate am Markt war (und ME noch kürzer), wurde es wahrscheinlich für Windows 98 und Windows NT 4.0 entwickelt. Computer zu der Zeit haben sowas gegen 64 MB - 128 MB RAM gehabt. Ein Durchschnittsrechner war damals ein Pentium II mit 500 MHz. Das Feinste vom Feinsten war ein Pentium III mit 1.4 GHz und die hat sich keiner leisten können.
Das ist wofür BlitzBasic gemacht ist. Wenn deine Maschine dein Spiel nicht packt, dann liegt es nicht an dem Gerät sondern an deinem Code.
Außerdem: je weiter das verwendete Windows von dem Windows entfernt ist, für das BlitzBasic programmiert wurde, desto schlechter läuft es. Rennt es auf XP nicht, dann wird es auch auf Vista, 7 und 8 nicht gehen.

Von den in Blitz eingebauten Funktionen gibt es eine Handvoll die nicht mehr richtig funktionieren oder verbuggt sind (siehe hier). Das sind hauptsächlich ImagesCollide und ImagesOverlap. Alles andere funktioniert.
Anfänger schieben Fehler gerne auf den Computer, ihr Windows, das Framework, die Library, das Wetter und die momentanen Himmelskonstellationen. Wenn dein Programm nicht funktioniert, dann kannst du dich mit beinahe sicherer Wahrscheinlichkeit darauf verlassen, dass der Fehler in deinem Code steckt. Immerhin schaffen es ja auch alle anderen mit den gleichen Geräten und der gleichen Software fehlerfreie Programme hinzukriegen, und das schon seit fast 14 Jahren im Falle von BB. Beinahe jede mögliche alte Software/Hardware-Kombination ist von einem der 18.000 Nutzer, die sich auf der BlitzBasic.com-Seite finden ausprobiert worden.

Bobo2040 hat Folgendes geschrieben:

Also soll ich NOCHMAL von neu anfangen ? ;D

Kannst du dich erinnern, was ich dir ganz am Anfang geschrieben habe?
DAK hat Folgendes geschrieben:
Aus eigener Erfahrung und den Erfahrungen von wörtlich hunderten anderen Hobbyprogrammierern vor dir (ich bin seit 2005 hier im Forum und in der Zeit habe ich SEHR viele Leute gesehen, wo das so rennt): Wenn dir dieses Spiel am Herzen liegt, und du es wirklich machen willst, dann leg es zur Seite, mach ein paar (mindestens 5) Minigames und kleinere Spiele, und dann schau es dir noch mal an, ob du es dir dann zutraust.
Was du da machen willst ist ein Megaprojekt. Die 100 Stunden, die ich da mal grob vorgeschätzt habe, sind für einen erfahrenen Programmierer, der das schon seit Jahren macht, und weiß was er tut. Für dich, als Neuling, sind es wohl eher (realistisch, nicht böse) geschätzt 500-1000 Stunden.
Du wirst dein Projekt versuchen aufzuziehen, dabei viel lernen, aber auch ein grauenhaftes Chaos aus deinem Projekt machen. Du wirst neue Sachen lernen, aber da es dann schon zu viel Arbeit ist, etwas zu ändern, wirst du den Rest deines Projekts dich durch den grauenhaften Code kämpfen müssen, bis du irgendwann an einem Punkt stecken bleibst, wo deine schlechte Vorarbeit dir den weiteren Weg versperrt.
Dann wirst du das Projekt entweder aufgeben, oder wenn du wirklich die Disziplin hast, es einstampfen und komplett neu schreiben.
Darum: Wenn dir das Projekt am Herzen liegt, leg es bei Seite.


Vielleicht hörst du ja inzwischen auf gute Ratschläge: Bau ein Spiel, das deinen Fähigkeiten entspricht. Ein Spiel, wo du nicht auf Anhieb ein halbes Dutzend Frameworks einlernen muss. Dann bau ein Spiel, wo du ein kleines bisschen dazu lernen musst. Und so weiter.

Bau fünf kleine Spiele, dann hast du vielleicht das gelernt, was du brauchst um ein Großes anzufangen.

Fang mit was kleinem an, einen wirklich schönen Pong-Klon oder so. Habe ich auch gemacht. Es motiviert ungemein auch nur was Kleines fertig zu machen. Dann mach einen Spaceshooter oder ein Jump-N-Run. WoW 2 / Dark Orbit 2 kannst du immer noch machen wenn du das kannst. So rennst du dir dauernd den Kopf ein, weil du Sachen lernen musst, die dir noch Monate oder Jahre zu hoch sind und kriegst nichts zu stande. Das demotiviert und nervt alle anderen mit.


Und was Libs angeht: Wenn du an BNetEx scheiterst, dann gute Nacht. Und wenn du diese Befehle haben willst, die gibt es fast 1:1 im Standard-Blitz.
Ich hab letztens für die Arbeit ein Framework gebraucht um Telnet und SSH zu verarbeiten (unter Java). Ich habe zwar eine Lib gefunden, die beides kann, habe aber im Endeffekt den Telnet-Teil großzügig umschreiben und den SSH-Teil komplett durch eine andere Lib ersetzen müssen, weil sie nicht ganz auf das gepasst hat, was ich gebraucht hab. Habe dabei auch gleich beides stark optimiert, so dass die Lib jetzt einen Kleinteil der Ressourcen von davor braucht.
Wenn du es nicht schaffst durch den Source von den Beispiel-Dateien zu steigen, dann ist das der Zeitpunkt um einen Schritt zurück zu machen, was anderes anzufangen und hier her zurück zu kommen, wenn du so weit bist.



Sorry für die Länge von diesem Post, aber es hat mal wieder raus müssen.

Edit: Die Zeit die ich in meinem Zitat da vorgeschätzt habe ist bei weitem zu niedrig angesetzt.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Bobo2040

BeitragFr, Feb 14, 2014 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay ja so waage kann ich mich dran erinnern Very Happy
Naja so halb ist ja das Spiel mittlerweile ok ... klar ist nicht das beste hier
und da nen Paar Bugs etc. aber ich werde es wahrscheinlich eh neuschreiben weil ich wie gesagt
mittlerweile an nem punkt bin wo ich ins stottern komme und hier was zu machen muss ich erstmal 200 zeilen code abändern (bisschen übertrieben Smile ) An der Motivation mangelts bei mir aber nicht Smile
Sondern am können bleib ich hängen ...
Und nochmal zum Thema wegen OS etc ich meinte nicht das mein XP dafür nicht geht oder
gar das Spiel nicht flüssig läuft, was es tut jedoch ists nunmal so das der Server und allgemein Verbindungssachen TCP und UDP ziemlich langsam bei mir laufen...auf dem Rechner von nem Kumpel aber schnell sind Wink
Mfg

Nochmal ne Frage zu TCP:
Du meintest ich solls mit TCP machen also das Willkommen, also das er Connecten kann/darf
wie bekomme ich aber die IP und Port von ihm raus ? Geht das in TCP überhaupt ?
Will ja die Daten dann direkt für UDP benutzen damit er nicht nochmal ne Anfrage starten muss... Very Happy
  • Zuletzt bearbeitet von Bobo2040 am Fr, Feb 14, 2014 15:46, insgesamt einmal bearbeitet
 

Matthias

BeitragFr, Feb 14, 2014 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay.
Ich muß DAK Recht geben.
Ich wollte auch immer das super duper Megaprojekt programmieren. Doch letztendlich nach Jahren habe ich kapiert das ich vorher un mengen Testprogramme schreiben muß.
Jedes einzelne System ob es nun GUI (Bediensysteme) KI, Datensysteme (Spielstand Speichern Laden usw) Pfadfinding oder auch Wirtschaftssysteme sind, müssen vorher schon einmal Programmiert worden sein.

Und diese Systeme selbst können wiederum Fehler aufweisen. Selbst wenn sie Fehlerfrei sind gibt es noch Möglichkeiten sie zu beschleunigen oder dafür zu sorgen damit sie weniger Speicher verbrauchen.

Du muß erst einmal mindestens 80% der Blitzbasic Befehle schon einmal benutzt haben, damit du weißt welche Möglichkeiten du hast. Vor allem Types und Banken sind Wichtig.

Manchmal denkt mann der Code ist Top und erst viel später merkt mann das mann sich doch verfranst hat.
Dann muß mann neu Anfangen, und der Code war umsonst. Doch mann hat gelernt. Und darauf kommt es an. Es ist noch kein Meister vom Himmel gefallen.
Programmieren ist lernen. Lernen durch Fehler. Smile
 

Bobo2040

BeitragFr, Feb 14, 2014 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay Very Happy joar das mit dem Denke das der Code top ist habe ich schon gemerkt
hatte davor die Ai (immer nur 1 Ai pro Map) in ner Globalen Variable gespeichert und mit ner Funktion
einen neuen Erstellt falls der Alte Tod war...
Jetzt habe ichs mitm Type gelöst und gehen viel mehr sachen mit Very Happy
Also kann mehrere Ais auf einmal erstellen Wink
Davor habe ich nicht soo viel von Types gehalten - hab sie nicht verstanden
jetzt benutze ich sie wos sinnvoll ist Very Happy
Mfg

DAK

BeitragFr, Feb 14, 2014 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
@Ins Stottern kommen / 200 Zeilen Code für Kleinigkeiten ändern müssen:
Das ist genau was ich gemeint habe. Du hast den Code begonnen, wie du noch deutlich weniger gekonnt hast als jetzt und ihn nicht von Anfang an gut durchdacht. Dieses mal schnell drauf los schreiben sorgt zwar dafür, dass du am Anfang unheimlich schnell voran kommst (da du keine Zeit für Planung u.Ä. aufwendest), dafür wird es dann später extrem anstrengend. Funktioniert gut bei Projekten die in 2 Wochen fertig sind und wo du dir den Code nie wieder anschaust, aber bei allem was länger braucht ist das eine absolute Katastrophe.

Projektdesign will genauso gelernt sein wie das Programmieren selbst. Und das lernt man nur, wenn man viele Projekte designt. Hier auch wieder: viele kleine Projekte sind zum Lernen besser als ein Großes.

Was noch dazu kommt ist dass sich der Programmierstil während der Lernphase stark ändert. Der Code auf den man vor einem Monat noch stolz war macht einem jetzt das Leben schwer. Auch hier wieder: je größer das Projekt desto mehr Codeleichen schleift man mit, die einem die Arbeit schwer machen.

Du hast noch Zeit genug für dein Megaprojekt. Mach zuerst mal ein paar coole kleine Spiele.

Es ist keine Schade ein Projekt aufzugeben oder auf später zu verschieben, wirklich nicht.


@Langsam bei dir, schnell bei anderen: Klar dass ein schnellerer PC Sachen schneller machen kann. Auf einem Supercomputer läuft auch absolut ineffizienter Code recht flott (rein nach "mit genügend Geschwindigkeit fliegt auch ein Scheunentor"). Auf der anderen Seite machst du ja wirklich nichts rechenintensives. Wenn man bedenkt, dass z.B. Age of Empires, das für Computer mit 90 MHz, 16 MB RAM und Modems mit 28.8 kbit/s gemacht wurde, 1500 Einheiten per Internet-Spiel verarbeiten konnte, dann kann es nicht an deinem Computer liegen.
Gewinner der 6. und der 68. BlitzCodeCompo

count-doku

BeitragFr, Feb 14, 2014 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

ich muss hier mal eben noch was zum Delay sagen.
Ja es ist teilweise unschön, und ich kenne auch den Hurra 100% Auslastungs Thread, aber zumindest bei mir in der aktuellsten Version von Blitz3D kann ich nicht sagen, dass Delay wirklich schlecht ist. Es lastet die CPU nicht zu 100% aus.

Ein Delay gibt genauso CPU Zeit frei wie der Timer. Im schlechtesten Fall wartet der auch einfach stumpf bis zum nächsten Tick ab. Folgende Codes machen exakt das gleiche:
BlitzBasic: [AUSKLAPPEN]
Graphics 1920,1080,32,1
SetBuffer BackBuffer()

Local timer=CreateTimer(50)
While Not KeyHit(1)

WaitTimer timer ; Wartet im worst case ( nichts in der Schleife zu tun) 20ms ab.
Wend
End

BlitzBasic: [AUSKLAPPEN]
Graphics 1920,1080,32,1
SetBuffer BackBuffer()

While Not KeyHit(1)

Delay 20 ; Wartet immer 20ms ab
Wend
End


Der einzige wirkliche Unterschied ist, dass der timer quasi ein delta fürs warten ausrechnet und nur so lange oder auch garnicht wartet.

So ungefähr:
BlitzBasic: [AUSKLAPPEN]
Graphics 1920,1080,32,1
SetBuffer BackBuffer()

Local lastAkt=MilliSecs()
While Not KeyHit(1)

Delay 20-(MilliSecs()-lastAkt) ; Wartet 20ms - die schon in der Schleife vergangene Zeit
lastAkt=MilliSecs()
Wend
End


Es mag sein, dass in älteren BB Versionen das Delay wirklich die CPU auf 100% gebracht hat und es deswegen in so vielen Köpfen festsitzt. Aber die Zeit "selbst aufteilen" wie ich hier immer wieder lese tut der Timer gewiss nicht.

- - - - -

Zum aktuellen Problem,
wenn dein Code so wie oben gepostet, lauffähig ist, dann vereinfache ihn nur auf das connecten, und vermitteln von einem Integer oder sonstwas zwischen den Clients. Dann findest du leichter den Fehler und auch Leute, die deinen Code kurz durchsehen.

Ansonsten DebugLog wurde ja schon erwähnt.


lg,
Count-Doku

PS. Ich könnte auch wieder was zu den Netzwerklib Empfehlungen schreiben, dass lasse ich hier jedoch.
 

Bobo2040

BeitragFr, Feb 14, 2014 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja habs gemerkt Wink aber man kann einen kompletten Anfänger von seiner Überzeugung NIE abhalten Wink
Ich bin mit meinem Projekt so halb auf die Schnauze gefallen wie 1000 andere vor mir Very Happy Das ist halt so Smile
Mittlerweile schreibe ich mir sachen Funkttionen die in mein Darkorbit Clon kommen immer zuerst aufn Blatt papier und mache ne art Mindmap dazu... was brauche ich? Wie wird es unterbrochen? Was für Datensätze werden benutzt? Solls später falls der Server steht mit versendet werden... etc Very Happy
Naja das Projekt LightOrbit ist momentan erstmal Tod aber den Server probiere ich trz nochmal neu zu schreiben
so wies Dottakopf gesagt hat mit TCP und UDP gemischt und alles Schrittweise und dabei alles Debuggen...
In meinem Darkorbit Clone hätte ich Jetzt NICHT mehr die nerven zu Debuggen bei mittlerweile 35k Zeichen Very Happy
Dazu will ich aber Trz wissen ob ich mit TCP die Sende IP und Sende Port? herrausbekomme damit ichs direkt in ein Type reinmachen kann und dann nicht alles Doppelt machen muss weil UDP auch nochmal ne Bestätigung braucht Wink
Mfg

EDIT:
So ich habe jetzt mal so bisschen Angefangen und bin prompt auf ein Problem gestoßen
das ich weder mit Debuglog noch mit Sufu lösen konnte :/
Hier erstmal mein Server bist jetzt nur eine Funktion drinne Smile
BlitzBasic: [AUSKLAPPEN]

;Type Client erstellen
;Daten erstmal nur ip,port,username,accept um Code klein zu halten
Type Client
Field ip%
Field port%
Field username$
End Type
;Timer erstellen
Global FPStimer=CreateTimer(5) ; Für 5 Aktualisierungen pro Sekunde

;TCP Daten
Global TCPport=4342 ; ´Port für TCP
Global TCPstream=CreateTCPServer(TCPport) ;Server erstellen

;UDP Daten
;Comming Soon


;Überprüfen ob Server erstellt wurde...
If Not TCPstream Then
Print "TCP Server konnte nicht erstellt werden.."
WaitKey
End
EndIf

Print "TCP Server gestartet.."

;### Hauptschleife ###
Repeat

NewClient()
WaitTimer(FPStimer)
Until KeyHit(1)

;### Funktionen ###

;------------------------------
; Falls Anfrage von Client kam
;------------------------------
Function NewClient()
NewClient=AcceptTCPStream(TCPstream)

If NewClient<>0 Then ;Falls Variable NICHT leer ist
ClientStream=NewClient ;Variable auslagern, damit sie nicht permanent auf 0 gesetzt wird
; falls keine Nachricht kommt...
Print "Anfrage von neuem Clienten erhalten!"
DebugLog "NewCLient:"+NewClient
EndIf
DebugLog "ClientStream"+ClientStream
DebugLog "TCPstream"+TCPstream
If ClientStream<>0 Then ;Falls CLientstream einen Wert hat
While ReadAvail(TCPstream) ;Solange es Daten zum "lesen" gibt
username$=ReadLine(TCPstream) ;Daten auslesen
For client.Client=Each Client
If Not client\username$=username$ Then
;Falls Username NICHT übereinstimmt mit den Anderen dann
;Neuen Clienten erstellen
cClient.Client=New Client

cClient\ip%=127001
cClient\port%=5435
cClient\username$=username$

Print "Client mit Port:"+cClient\port%+",IP:"+cClient\ip%+" mit Username:"+cClient\username$+" wurde erstellt."

EndIf
DebugLog username$
Next
Wend
EndIf
End Function


Und hier der Client (nix großes)
BlitzBasic: [AUSKLAPPEN]

Local Stream = OpenTCPStream( "127.0.0.1", 4342 )
If Not Stream Then
Print "Verbindung konnte nicht hergestellt werden."
EndIf

WriteLine Stream, "Bernhard" ; Name senden
Print "Sende..."

WaitKey
; Stream beenden
CloseTCPStream( Stream )
End


Habe beide ziemlich viel mit dem Help beispiel aufgebaut , welches bei mir Funktioniert hat Smile
Aber das haut mir in der
While ReadAvail() nen Invalid TCP Stream raus...
Also habe ich TCPstream vor der Schleife in Debuglog geschrieben und siehe
da es hat einen Wert also habe ich wirklich keine Ahnung was ich hier jetzt groß machen
soll wenn ich die While Schleife auskommentiere, dann wird der Error bei
username$=readline(TCPstream)
ausgegeben...
ClientStream und NewClient haben bei einen Wert also wird da eine Msg gesendet und auch so
halb empfangen aber iwie passiert sonst nichts... :/
Mfg

DAK

BeitragFr, Feb 14, 2014 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil du aus TCPStream ausliest und nicht aus ClientStream.

Dein TCPStream sollte eigentlich TCPServer heißen, da er kein Datenstream in dem Sinne ist. Der TCPStream ist nur dafür da zu erkennen, wenn sich jemand neues verbindet und wirft dann aus AcceptTCPStream den Stream zu dem Client raus. Jeder Client hat somit einen eigenen Stream (Ergebnis von AcceptTCPStream) über den der Server mit dem einen Client redet.
Gewinner der 6. und der 68. BlitzCodeCompo

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group