Problem mit Stream
Übersicht

IllarionBetreff: Problem mit Stream |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
CopyStream scheint den Stream nicht kopieren zu können, zumindest passiert nichts wenn ich den mit CopyStream kopierten Stream abschicke ![]() ( 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich nutze DirectPlay. Geht schnell und einfach. Irgendwelche gravierenden Speedunterschiede habe ich noch nicht bemerkt. | ||
Illarion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? ![]() |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
Illarion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group