Arrays per Netzwerk

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

BlitzComer

Betreff: Arrays per Netzwerk

BeitragDi, Aug 16, 2011 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Abend zusammen Smile
Hier zu meiner ersten Frage im Blitzforum: Ist es möglich Arrays per Netzwerk, in meinem Fall über UDP zu verschicken. Bei mir will das nicht so ganz klappen. Ich erkläre mal eben, was ich überhaupt machen möchte.
Also der Server liest mehrere Texttitel von Textdateien aus und speichert bei jedem Schleifendurchgang diesen Titel in einen Array. Dann werden die Arrays an den Clienten geschickt. Dieser empfängt diese und soll sie untereinander schreiben. Ich hoffe das war so weit verständlich. Ich veröffentliche mal meine Codeschnipsel. Damit ihr das einigermaßen nachvollziehen könnt. Wäre klasse, wenn einer meinen Fehler entdeckt Smile

Server:
Code: [AUSKLAPPEN]

Verz = ReadDir("DATENBANK\Clubs\")

For i=0 To 16
   Clubs_dat$ = NextFile$(Verz)
   
    If FileType("DATENBANK\Clubs\" + Clubs_dat$) = 1 Then
      
      Clubs$(i)=Left$(Clubs_dat$,Len(Clubs_dat$)-4)
   
                Text 100,20*i,Clubs$(i)
   EndIf
   For c.client=Each client
      WriteInt udp_stream,c\ip
      WriteByte udp_stream,4
      WriteLine udp_stream, Clubs$(i)
      SendUDPMsg udp_stream,c\ip,8010
   Next
 Next
   
CloseDir Verz


Nun der Client:
Code: [AUSKLAPPEN]

Case 4
   Clubs$(i)=ReadLine(udp_stream) ;
             
End Select

Color 20,60,87
Rect 60,60,500,400
For i=0 To 16
        Color 255,255,255
   Text 60,60+20*i, Clubs$(i)+" "+i
Next
End Function

ZEVS

BeitragDi, Aug 16, 2011 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
@Server:
Keine programmbeeinträchtigenden Fehler.
Es ist mir nur unklar, wieso du dem Client seine eigene IP zusendest. Die Überprüfung
Code: [AUSKLAPPEN]
If FileType("DATENBANK\Clubs\" + Clubs_dat$) = 1 Then
is gewiss sinvoll, sollte dann aber auch weiter greifen, dass den Clients im Fehlerfall nicht allen ein leerer Name gesendet wird.
@Client:
Nur ein kleines Bruchstück. Trotzdem scheint es mir, als ob du zwei Schleifen ineinander verschachtelst, die als Zählervariable beide i verwenden. Das kann nicht gut gehen.

UDP ist als Netzwerkprotokoll sehr kompliziert. Weiterer Client-Code könnte helfen, auch Server-Code wäre interessant. Stellst du überhaupt sicher, dass alle Pakete ankommen?

ZEVS
 

BlitzComer

BeitragDi, Aug 16, 2011 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Also der gepostete Code gibt bisher das aus: https://www.blitzforum.de/upload/file.php?id=10869

Wenn ich die Zählschleife i durch bspw. a tausche, dann gibt der alle Clubs ganz schnell aus und das 16 mal, das ist ja auch klar, weil ich ja geschrieben habe: Text 0,60+20*a, clubs(i)



Wie stell ich denn fest, dass alle Pakete angekommen sind?

ZEVS

BeitragDi, Aug 16, 2011 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Da musst du dir ein spezielles (Wahrscheinlich Type-basiertes) System überlegen, dass ankommende Nachrichten annimmt, bestätigt und zur Verarbeitung weiterreicht und eines, das ausgehende Nachrichten speichert, deren Bestätigung abwartet und ggf. die Nachricht noch einmal sendet. Natürlich musst du auch eventuelle Doppelgänger ausmerzen. Und das ganze für Server und Client. UDP ist halt undankbar für Anfänger. Am Besten, du begnügst dich mit TCP (wo alles ankommt) oder einer lib wie SimpleUDP.

Für das Problem mit dem größeren Zeitraum brauche ich wirklich mehr Code.
ZEVS
 

PhillipK

BeitragDi, Aug 16, 2011 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde es über eine art ID regeln.

Jedem "packet" schreibt du vorne eine spezielle nummer, zb eine Short.

Nun liest du auf deiner Serverseite in einem rutsch alle titel in einen String - Array an. Dem client sendest du ersteinmal, wieviele titel du hast (wie groß dein string array ist!). Als ID stellst du zb 0 vorne an.

Client erhält ein pack mit id 0. Nun weiß er: Okay, initialisieren wir mal alles.
Er liest aus dem packet aus, wieviele titel zu erwarten sind und legt damit 2 Arrays an - einmal die Titel und einmal einen "Empfangen-Array" - zb int. Anzahl der einträge ist die selbe wie du titel hast.
Jedes element im Int-array sollte mit 0 initialisiert werden.

Nun sendet der Client dem server ein pack, ala id 1, inhalt erwartende titel.

Erhält der server das pack mit id 1, und der passenden anzahl an titeln, gehts los, er sendet die daten.
Als id setzt du zb die 2 vorne an, danach den index im array.

zuletzt sendest du dem client noch ein spezielles abschluss pack, zb id 10.

Sobald der client ein pack mit id 2 hat, weiß er, das der 2te Int daran die index nummer ist.
Er setzt nun Titel(Index) = Titel (auszulesen aus stream) , und IntArray(index) = 1.

Zuletzt erhält der client das pack mit id 10, was bedeutet, das der server der meinung ist, das er fertig hat.
Client prüft hier, ob er wirklich überall im IntArray() eine 1 hat und sendet dann eine bestätigung.
Andernfalls muss er wiederrum beim server nach den fehlenden array-indexen anfragen.

Ziemlich lästiges system, aber es klingt schwerer als es ist. Ich hab sowas mal für ein Map-senden geschrieben, da gingen zirka 120kb daten durch und locker 80% gingen verloren. Das lag allerdings daran, das ich 'zu schnell' gesendet hab - mit nem künstlichen send-delay (über millisecs() ) gings dann runter auf 10% verlust, die aber ganz schnell nachgesendet wurden. Smile

Hoffentlich konnte ich dir einen vorschlag zum sichereren übertragen mit UDP nahebringen :3

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group