C# Networkstream leeren

Fou-Lu

Lt. Junior Grade
Registriert
Aug. 2006
Beiträge
290
Hallo Leute,
wie kann man eigentlich beim Networkstream auf der Client-Seite wenn ich die Daten empfange (also: nStream.Read(....) benutze), aber genau diese Daten z.B. nicht empfangen will, sie löschen?

Also z.B. wenn eine eingehende Datei ankommt und ich sie aber nicht annehmen will, dann will ich die Bytes die gerade im Stream drin sind einfach leeren so zusagen. Wie würde das gehen? Flush klappt ja allem anschein nach nur bei der nStrea.Write(...) Methode, aber nicht wenns ums auslesen geht.

Hoffe ich habe es verstänldich genug geschrieben (bin grad etwas verplant) :D :D

Danke schonmal für jede Hilfe :)
 
.Flush() dient immer zum Leeren des Streams. Sonst halt so lange lesen und nichts machen, bis das Ende der Datei erreicht ist.
 
Auf der Clientseite würde ich den Stream einfach mit .Close() schließen. Dann müsste der Dateitransfer abbrechen. So kriegt das auch der Sender mit und kann das Senden einstellen.

.Flush() leert übrigens nur den Puffer, also quasi den Cache. Wenn du ne Datei schreibst, schreibt Windows die Daten nicht sofort in die Datei, sondern in einen Zwischenspeicher. Kannst du gut sehen wenn du mal ein paar Zeilen in einen FileStream schreibst. Die Datei bleibt erstmal 0 Bytes groß, auch wenn du schon geschrieben hast.
Mit .Flush() kann man diese schwebenden Daten dann explizit in die Datei schreiben.
 
Ich habs schon befürchtet, dass es nicht geht :(
Die Lösung die ich derzeit habe war auch "Daten auslesen und ignorieren", aber habe wirklich gehofft, es gebe einen eleganteren Weg ;-)

Naja danke für die Hilfe. Immerhin hab ich jetzt gewissheit darüber, dass man den Stream tatsächlich nich leeren kann.


@MacGyver: Close() ist in meinem Fall leider keine Lösung. Man soll ja trotzdem weitere Dateien empfangen können (auch wenn man jetzt die eine nicht will), ohne eine neue Verbindung herstellen zu müssen. ;-)
 
Gibts vielleicht sowas wie Skip oder Seek?

Hab jetzt das Objektmodell nicht vor mir, aber Streams bieten das eigentlich an.
Wenn du ermitteln kannst wie lang die Datei in Bytes ist, könntest du einen Sprung zur nächsten Datei machen.
 
Schick dem Sender doch einfach einen Skip-Befehl, dass er diese auslassen kann. Kannst dir ja im Log deines FTP-Programms mal ein wenig Inspiration holen.
 
@MacGyver: Das Netzwerk ist streambasiert bzw. strombasiert, und genau aus dem Grund gibt es nichts wie ein Seek... das Ganze hat relativ wenig zu tun mit einem FileStream, wo ein wahlfreier Zugriff erfolgen kann...

Eigentlich erfolgt bei einem Stream der Zugriff immer sequentiell... die eventuell daraus entstehenden Probleme sieht man an diesem Thread.
 
Also es gibt zwar beim Networkstream eine Eigenschaft "Position", aber die wird derzeit nicht unterstützt. Deswegen kann man die Bytes so gesehen auch nicht "überspringen".

@Yuuri: Es geht nicht um ein FTP Programm... bin grad an einer Bibliothek zur Dateiübertragung zwischen Clients dran (so im Stil von ICQ und den ganzen Messengern). Bei denen kann man ja auch angeben, dass man die Datei nicht annehmen will, aber eine andere z.B. doch wieder bestätigen (ohne, dass die Verbindung flöten geht).

Daher auch meine Frage... aber naja... allem Anschein nach gibts wohl keine Möglichkeit als die Daten auszulesen und dann zu schrotten :D
 
Deswegen sollst du dir ja auch mal das Log deines FTP-Programms ansehen. Dort gibts Kommandos wie CWD, STOR, OPTS, USER, PASV und noch viele mehr, womit der Kontrollfluss gesteuert wird. Lass dem Client doch einen Knopf "Diese Datei überspringen" und dieser gibt dem Server ein "SKIP xyz.mp3", "SKIP current" oder einfach nur "SKIP" mit auf den Weg, was dem "Server" mitteilt, die Übertragung der aktuellen Datei abzubrechen und mit der nächsten weiterzufahren.

;)
 
Also wenn du ein Übertragungssystem "von Hand" schreiben willst, und nicht auf irgendwelche Protokollzwänge oder bestehende Serverdienste angewiesen bist, dann denk dir doch dein eigenes Protokoll aus.

Du könntest z.B. festlegen, dass jede Datei- oder Datenübertragung mit einem speziellen Schüsselwort beginnen muss, und dass darauf eine Antwort von der Gegenstelle erfolgen muss, damit dir Übertragung startet. So machen es alle anderen Programme auch, z.B. Messenger.

So ein Protokoll würde doch schon reichen:

PC1: OFFER Urlaubsfotos.zip
PC2: REJECT
PC1 sendet die Datei nicht

oder eben

PC1: OFFER Urlaubsfotos.zip
PC2: ACCEPT
PC1 sendet die Datei
 
Ok das ist mal ne Idee :)

Hat mir sehr weitergeholfen. Vielen vielen Dank :)
Das ich nicht selbst drauf gekommen bin... -_- (manchmal sieht man den Wald vor lauter Bäumen nicht :D )
 

Ähnliche Themen

Zurück
Oben