Laden...

TCPClient funktioniert im W-LAN fehlerhaft...

Erstellt von Stomper vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.844 Views
S
Stomper Themenstarter:in
14 Beiträge seit 2009
vor 14 Jahren
TCPClient funktioniert im W-LAN fehlerhaft...

Hallo,

ich habe ein kleines Programm geschrieben, dass die Outlook-PST Datei von meinem Hauptrechner an verschiedene Clients per TCP/IP verteilt.

Der Client kann die Datei dabei Anfordern, oder an den Rechner senden. Eine Art einfache Synchronisation.

Beim Testen im LAN lief alles super - jetzt habe ich mein Laptop ausgesteckt und mit W-LAN Synchronisieren wollen - siehe da, die empfangene Datei ist zu groß!

Outlook erkennt die Datei so nicht und bringt einen Fehler.

Hier mal der Server Code etwas zusammengefasst


public void SendData()
            {
                BinaryReader fr;

                // Öffne Datei zum Senden
                try
                {
                    fr = new BinaryReader(File.Open(FilePath, FileMode.Open));
                }
                catch
                {
                    connection.Close();
                    return;
                }
                // Hole Stream
                NetworkStream stream = this.connection.GetStream();

                // Erzeuge Bytes zum senden
                Byte[] myByte = new Byte[256];


                Thread.Sleep(20);
                
                // Dateigröße ermitteln
                FileInfo fi = new FileInfo(FilePath);

                myByte = Encoding.ASCII.GetBytes(fi.Length.ToString()+"Bytes");

                // Dateigröße senden
                stream.Write(myByte, 0, myByte.Length);

                Thread.Sleep(20);
                // Laufvariable für Senden von Daten
                int i;
                myByte = new Byte[256];

                try
                {
                    // Daten zu Client senden
                    while ((i = fr.Read(myByte, 0, myByte.Length)) != 0)
                    {
                        stream.Write(myByte, 0, myByte.Length);

                    }

                }
                finally
                {

                    // Verbindung beenden und Datei schließen
                    connection.Close();
                    fr.Close();

                }

Hier der Client Code zum empfangen


            // Binary Writer für Dateiempfang öffnen
            BinaryWriter fr = null;

            // Lösche Bak-File, falls sie existiert.
            File.Delete(filepath + ".bak");

            try
            {
                // Datei zum emfpangen öffnen
                fr = new BinaryWriter(File.Open(filepath + ".bak", FileMode.Append));
            }
            catch
            {
                MessageBox.Show("Konnte Datei zum Speichern auf lokalem Rechner nicht öffnen! Brechtigungsproblem?!", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }




                // Erzeuge TCP Clienten mit Server und Port
                TcpClient client = null;
                NetworkStream stream = null;
                txtStatus.Text = "Stelle Verbindung her...";
                Application.DoEvents();
                Thread.Sleep(2000);

                
                try
                {
                    client = new TcpClient(server, Convert.ToInt16(txtPort.Text));

                }
                catch (System.Net.Sockets.SocketException e)
                {
                    MessageBox.Show(e.ToString(), "Netzwerkfehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;

                
                }
                catch
                {
                    MessageBox.Show("Unbekannter Fehler im Netzwerk!", "Netzwerkfehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;


                }
                
                // Netzwerkstream holen
                try
                {
                    stream = client.GetStream();

                }
                catch (System.Net.Sockets.SocketException e)
                {
                    MessageBox.Show(e.ToString(), "Netzwerkfehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;


                }
                
                Byte[] myByte = new Byte[256];




                // Server Senden, ob Datei gesendet oder empfangen wird
                myByte = Encoding.ASCII.GetBytes("SEN");
                stream.Write(myByte, 0, 3);

        
                // Byte neu initialisieren
                myByte = new Byte[256];



                txtStatus.Text = "Verbindung hergestellt";
                Application.DoEvents();

                Thread.Sleep(300);


                // Dateigröße Empfangen
                stream.Read(myByte, 0, myByte.Length);

                // In String wandeln um Sie auszuwerten
                String MyString = Encoding.ASCII.GetString(myByte);

                // Byte in String finden, damit Größe errechnet werden kann
                MyString = MyString.Substring(0,(MyString.IndexOf("Byte")));
      
                Int64 Filesize = Convert.ToInt32(MyString);
                if (Filesize > 1500000000)
                {
                    MessageBox.Show("Die zu emfpangende Datei ist zu groß! Max. Dateigröße ist 1.500.000.000 Bytes", "Netzwerkfehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                int i = 0;
                myprogressBar.Value = 0;
                myprogressBar.Minimum = 0;
                // Rechne das Maxiumum aus Dateigröße / 256 / 100 (Alle 100 Schritte ein Step)
                myprogressBar.Maximum = Convert.ToUInt16(Filesize/25600);
                myprogressBar.Step = 1;

                Thread.Sleep(100);
                try
                {
                    // Server sendet nun die Daten - daten empfangen...
                    while (stream.Read(myByte, 0, myByte.Length) > 0)
                    {
                        fr.Write(myByte, 0, myByte.Length);
                        txtStatus.Text = "Empfange Daten von Server...";
                        
                        // Steuere Progressbar (alle 100 Zyklen 1 Step)
                        if (i >= 100)
                        {
                            myprogressBar.PerformStep();
                            i = 0;
                        }
                        i++;

                        Application.DoEvents();
                    }
                }
                catch
                {
                    MessageBox.Show("Bei der Übertragung ist ein Fehler aufgetreten!", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }


                // Close everything.
                    stream.Close();
                    fr.Close();
                    client.Close();
                    txtStatus.Text = "Verarbeite Daten...";
                    File.Delete(filepath + ".3");
                    File.Copy(filepath + ".bak", filepath + ".3");
                    File.Delete(filepath + ".bak");
                    txtStatus.Text = "Empfang vollständig.";
          

Weiß jemand warum es im LAN geht und im WLAN nicht, bzw. die Datei im WLAN zu groß ist?!

Gruß
Stomper

T
36 Beiträge seit 2007
vor 14 Jahren

Wie lautet der Fehler und wie groß ist die pst?

S
Stomper Themenstarter:in
14 Beiträge seit 2009
vor 14 Jahren

Naja, es gibt keine Fehlermeldung.

Die Datei ist Ursprünglich 89.408.512 Bytes groß
Auf dem Laptop kommen 90.056.704 Bytes an.
Also ein Überhang von 648.192 Bytes.

Ich hab mir die Dateien mit dem Hexeditor angesehen.
Ich dachte erst, die Datei wird nur zu groß, aber leider ist die Datei auch vom Inhalt her anders, bzw. vermurxt. Den Header z.B. kann ich gar nicht finden.

Wie kann das sein, dass es über W-LAN solche Probleme gibt, während es im LAN normal läuft?!

Ist mein Code schlecht? Ich hab vorher noch nie so etwas programmiert, setzte ich den TCPClient und TCPListener richtig ein?

Gruß
Stomper