Problem mit Stream

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Illarion

Betreff: Problem mit Stream

BeitragDi, Aug 24, 2004 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich hab mal eine kleine Frage :


Wie kann ich einen Stream duplizieren ?

Das Problem : Ich möchte mein Game netzwerkfähig machen und an JEDEN Spieler Nachrichten schicken :

Function LAN_abschicken() ; Schickt den Stream an alle anderen Spieler !
For lan.Tplayer = Each Tplayer
SendUDPMsg sende_stream, lan\ip, empfangs_port
Next
End Function

Wenn ich die Funktion jetzt aufrufe, dann wird an den ersten Player der Stream übermittelt, jeder weitere Player bekommt jedoch keine Nachricht mehr, da der sende_stream nach dem Absenden leer ist.

Wie kann ich den vorher kopieren ?
Habs über eine Hilfsvariable probiert - nichts !



Oder muss ich die gesamte Netzwerkroutine von UDP auf directPlay umstellen ( dort kann man ja an mehrere zeitgleich senden).
Problem dort ist die umständliche Datenübertragung was die Typen anbelangt.


Bitte um Hilfe !

Hubsi

BeitragDi, Aug 24, 2004 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab jetzt nicht 100%ig Dein Problem verstanden, aber Streams lassen sich mit CopyStream kopieren.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Illarion

BeitragDi, Aug 24, 2004 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
CopyStream scheint den Stream nicht kopieren zu können, zumindest passiert nichts wenn ich den mit CopyStream kopierten Stream abschicke Sad
( der ist genauso gelöscht wie der abgeschickte )

Ist es denn nicht möglich mit UDP gleiche Nachrichten an mehrere PCs zu senden ???
Jedesmal wenn ich einen Stream abschicke ist er weg, es kann also nicht der gleiche stream nochmals an einen anderen PC versendet werden !

Ist es überhaupt empfehlenswert mehr als 2 PCs über UDP mit nur 2 Ports( eingangsport und ausgangsport ) zu verbinden ?

Oder empfiehlt es sich directplay zu benutzen ?

Mein Projekt soll ein actionlastiges Spiel mit Mehrspielermodus werden...deswegen dachte ich UDP wäre ideal.
 

David

BeitragDi, Aug 24, 2004 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Ich würde in deinem Fall eher TCP als Protokol vorschlagen, bzw DirectPlay basiert wohl darauf oder?

Wieso sollte CopyStream nicht funktionieren?
Post doch mal bitte den betreffenden Codeteil.

grüße
http://bl4ckd0g.funpic.de
 

sdjh

BeitragDi, Aug 24, 2004 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nutze DirectPlay. Geht schnell und einfach. Irgendwelche gravierenden Speedunterschiede habe ich noch nicht bemerkt.
 

Illarion

BeitragDi, Aug 24, 2004 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Function LAN_abschicken() ; Schickt den Stream an alle anderen Spieler !
For lan.Tplayer = Each Tplayer
CopyStream sende_stream, zs ; der Stream, den Ich verschicken möchte
SendUDPMsg sende_stream, lan\ip, empfangs_port
Next
End Function

anmerkung :
sende_stream ist ein UDPstream mit port 8001
zs dient als ZwischenStream wegen dem Kopieren und hat den Port 8002


Das Problem mit directplay ist der höhere Sendeaufwand, da ich nur strings verschickt bekomme ( oder irre ich mich da ) und die mehr speicherplatz benötigen -> mehr Traffic verursachen !
 

Illarion

BeitragDi, Aug 24, 2004 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
nach ja :
das hier soll eigendlich den stream zurückkopieren und steht nach SendUDPMsg :


CopyStream (zs,sendestream)


produziert aber folgendes : Stream doesn't exist
 

Illarion

BeitragDi, Aug 24, 2004 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry das ich schon wieder Poste, hab aber jetzt mal ein kleines Testproggi zur Veranschaulichung des Problems :



Graphics 800,600,0,2

Const sende_port = 8001
Const empfangs_port = 8000
Global sende_stream = CreateUDPStream(sende_port)
Global empfangs_stream = CreateUDPStream(empfangs_port)

WriteLine(sende_stream, " TEST ")
For a=0 To 2
SendUDPMsg sende_stream, -1062731775, empfangs_port ; sollte eine Nachricht an lokalen spieler senden , -1062731775 = 192.168.0.1
Next

Repeat
ip_nummer = RecvUDPMsg(empfangs_stream)
i=i+1
If (ip_nummer<>0) Then
Text 10,i*FontHeight(),ReadLine(empfangs_stream)
EndIf

Until ip_nummer=0 ; Bis keine Nachrichten mehr abzurufen sind

Repeat
Until KeyHit(1)
End




Ich empfange trotz 3 Durchläufe nur einmal "TEST", da der Stream beim abschicken auf meinem Rechner verloren geht.
Ich möchte das Programm so modifizieren, dass ich den Stream beliebig oft abschicken kann ( in diesem Beispiel würde ich ihn z.B. 3 mal abschicken ) !


Wie kann ich das realisieren ???

DivineDominion

BeitragDi, Aug 24, 2004 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Fehlende CODE-Tags hier in den Psots machen das lesens chwer, aber ich würde darauf tippen, dass es an dem fehlenden _ liegt: sende_stream.

Edit: Zu deinem danach geposteten Dingens kann ich nicht viel sagen, habe UDP noch nie benutzt. Vielleicht 2 Programme laufen lassen, einer der sendet und einer der zuhört? Smile
christian.tietze@gmail.com - https://christiantietze.de
macOS
 

Illarion

BeitragDi, Aug 24, 2004 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Graphics 800,600,0,2

Const sende_port   =   8001
Const empfangs_port   =   8000
Global sende_stream   =   CreateUDPStream(sende_port)
Global empfangs_stream   =   CreateUDPStream(empfangs_port)

Global zs = CreateUDPStream(8002)


WriteLine(sende_stream, " TEST ")
CopyStream (sende_stream, zs)

x=ReadAvail (sende_stream)
For a=0 To 2
   CopyStream (zs, sende_stream)
   SendUDPMsg sende_stream, -1062731775, empfangs_port   ;-1062731775 = 192.168.0.2 als Integerwert
Next

Repeat
   ip_nummer   =   RecvUDPMsg(empfangs_stream)
   i=i+1   
   If (ip_nummer<>0) Then
      y=ReadAvail (empfangs_stream)
      Text 10,i*FontHeight(),ReadLine(empfangs_stream) + " Avail-SendeScream : " + x + " Avail-Empfangs_stream " + y
   EndIf
      
Until ip_nummer=0 ; Bis keine Nachrichten mehr abzurufen sind

Repeat
Until KeyHit(1)
End



Ok hier mit Code-Tag.

Hier kopiere ich den Stream auf einen Auslagerungsstream zs, den ich extra neu erstellt habe. Auch das hat keine Wirkung. Einmal versendet ist der Stream verloren Sad
 

BIG BUG

BeitragDi, Aug 24, 2004 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Aufgrund des Beispiels in der Onlinehilfe vermute ich mal, dass "CopyStream" eigentlich "MoveStream" heissen sollte. Der Quell-Stream wird zwar in den Zielstream kopiert, jedoch dieser dabei wieder geleert.
Naja, dafür eine eigene Routine zu schreiben sollte aber kein Problem sein...
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)
 

Illarion

BeitragMi, Aug 25, 2004 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Tja sollte es nicht ?

Jetzt nicht lachen - Dummerweise ist es das für mich aber. Sollte noch dazu sagen, dass ich doch noch ein recht unerfahrener "Blitzer" bin.

Wäre super wenn mir jemand so eine Routine schreiben könnte, oder mich wenigstens ansatzweise auf den richtigen Weg stoßen würde.


Wollte die Netzwerkgeschichte mit P2P machen, nicht Client/Server, deswegen ist das schicken eines Streams an mehrere ja so wichtig !
Oder ist P2P mit UDP einfach nicht möglich ???
 

BIG BUG

BeitragMi, Aug 25, 2004 23:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Lies einfach die komplette Message byteweise in ein Dim-Feld oder eine Bank ein und dann schreibe sie wieder byteweise an die Clients raus.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Hummelpups

BeitragDo, Aug 26, 2004 3:05
Antworten mit Zitat
Benutzer-Profile anzeigen
schreib doch einfach Server und Clienten. Ist das einfachste.
Lässt sich sogar mit DirectPlay verwirklich.

oder du musst die Daten NEU in den Stream schreiben da der inhalt des Strams nach dem Senden gelöscht wird.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group