Laden...

Daten übers LAN senden

Erstellt von yourmama vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.036 Views
Thema geschlossen
Y
yourmama Themenstarter:in
25 Beiträge seit 2009
vor 14 Jahren
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!

L
770 Beiträge seit 2006
vor 14 Jahren

Hallo yourmama,

ich habe deinen Code nicht durchforstet, aber beim schnellen Überfliegen habe ich Flush nicht gefunden, eventuell löst das dein Problem.

Lion

lg Lion

Y
yourmama Themenstarter:in
25 Beiträge seit 2009
vor 14 Jahren

Danke für die schnelle antwort.
Könnte sowas an einem Flush liegen?
er schreibt ja eig nur das letzte byte nicht..

habe mal flush() eingebaut, aber ohne erfolg.

lg

L
770 Beiträge seit 2006
vor 14 Jahren

Clears all buffers for the current writer and causes any buffered data to be written to the underlying device. klick

Also denke ich, ja das hätte das Problem sein können, da er eventuell gebufferte Daten noch nicht geschrieben hätte.

lg Lion

Y
yourmama Themenstarter:in
25 Beiträge seit 2009
vor 14 Jahren

Mein Fehler!

Hatte hier einen kleinen Codefehler, und mit der Catch Methode fängt er wirklich folgenden Fehler ein:


public void Start()
        {
            fc();

            try
            {
                listener.Start();

                while (!listener.Pending())
                {
                    TcpClient client = listener.AcceptTcpClient();
                    handleClient(client);
                }
            }
            catch (Exception ab)
            {
                MessageBox.Show(ab.ToString());
            }
        }

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!

6.862 Beiträge seit 2003
vor 14 Jahren

Geschlossen wegen Crosspost.

[Hinweis] Wie poste ich richtig? Punkt 2.2

Baka wa shinanakya naoranai.

Mein XING Profil.

Thema geschlossen