Daten übers Lan senden
-
Habe hier ein schönes Snippet gefunden um Daten (zip, jpeg etc.) über das Netzwerk zu senden.
Das Sendescript läuft einwandfrei. Hab das mit netcat getestet
nc -lp 8000 > datei.zip
Sendescript verbindet sich, sendet alles und nc schreibt die Datei. Dateigröße und Funktionalität sind erhalten.
Wenn ich jetzt aber das C# Empfangsscript benutze, so schreibt er mir die letzten(?) paar Bytes (?) nicht. Sprich die Datei ist um ein halbes kb kleiner, und nicht funktionsfähig.
Der Code:
public class filereceiver { string data_dir; public string tmp; TcpListener listener; public void fc() { data_dir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),"Data"); if (!Directory.Exists(data_dir)) Directory.CreateDirectory(data_dir); listener = new TcpListener(8181); } public void Start() { fc(); try { listener.Start(); while (!listener.Pending()) { TcpClient client = listener.AcceptTcpClient(); handleClient(client); } } catch { } } public void Stop() { listener.Stop(); } private void handleClient(TcpClient client) { NetworkStream stream = client.GetStream(); Encoding enc = Encoding.UTF8; while (true) { byte[] buffer = new byte[1024]; int read = stream.Read(buffer, 0, 1024); if (read == 0) break; string cmd = enc.GetString(buffer, 0, read); string file = cmd.Substring(5, cmd.Length - 5); file = file.Trim(new char[] { '\r', '\n' }); receiveFile(stream, file); } stream.Close(); Stop(); } private void receiveFile(NetworkStream stream, string filename) { data_dir += "\\" + tmp; using (BinaryWriter writer = new BinaryWriter(File.Create(data_dir))) { while (true) { byte[] buffer = new byte[1024]; int read = stream.Read(buffer, 0, 1024); writer.Write(buffer, 0, read); if (read == 0) { writer.Write(buffer, 0, read); break; } } } } }
Suche schon seit 3 Tagen und kann nichts finden!
Danke schonamsl!
-
Nur ne vermutung beim drüber schaun:
Ich glaube du sendest auch nich alle Bytes:
int read = stream.Read(buffer, 0, 1024); if (read == 0) break; //wenn read == 0 ist, solltest du nioch den rest buffer in die file schreiben, und nich aus der schleife springen!! string cmd = enc.GetString(buffer, 0, read); string file = cmd.Substring(5, cmd.Length - 5); file = file.Trim(new char[] { '\r', '\n' }); receiveFile(stream, file);
-
ganz böses Pfui
try { listener.Start(); while (!listener.Pending()) { TcpClient client = listener.AcceptTcpClient(); handleClient(client); } } catch { }
Du unterdrückst hier jegliche Fehlermeldungen ... da sollte wenigstens
try { } catch(Exception ^ ex) { Console::WriteLine(ex->getMessage()); }
gewöhn Dir das mal bitte an - damit suchst Du weniger ... da dürfte nämlich eine SocketException oder etwas anderes in der Art fliegen
hand, mogel
-
@NullBlockException
Habe mal das Break rausgeworfen, und es funktioniert immer noch nicht.@mogel
Hatte natürlich schon mal ein Exception est => MessageBox.Show(est.ToString()); drinnen, aber da es keinen Fehler warf (habs auch vorhin wieder getestet) hab ichs rausgenommen.
-
@mogel
Mein Fehler!Hatte hier einen kleinen Codefehler, und mit der Catch Methode fängt er wirklich folgenden Fehler ein:
SystemInvalidOperationException
Not listening. You must call the Start() method before calling this method.
at System.Net.Sockets.TcpListener.Pending()Wie behebe ich das am Besten?
Vielen Dank!