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!
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
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
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!
Geschlossen wegen Crosspost.
[Hinweis] Wie poste ich richtig? Punkt 2.2
Baka wa shinanakya naoranai.
Mein XING Profil.