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
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