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!


Anmelden zum Antworten