Laden...

Maximale Länge von dem Buffer in einem TCP-IP Verbindung, damit Texte richtig empfangen werden

Erstellt von gustavmega vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.221 Views
G
gustavmega Themenstarter:in
78 Beiträge seit 2012
vor 7 Jahren
Maximale Länge von dem Buffer in einem TCP-IP Verbindung, damit Texte richtig empfangen werden

Hallo,

ich habe einen Server, der über einer TCP-IP Verbindung Text-Dateien von einem Client empfängt und möchte gerne wissen, wie mximale Länge von dem Buffer sein soll, damit die Texte auch vollständig empfangen werden? Ich habe momentan byte[] buffer = new byte[Int32.MaxValue]; Ist das richtig?

mein Code sieht wie folgt aus:

Client:


tcpclnt = new TcpClient();
string stream = "";
tcpclnt.Connect(IPv4, Port);
Stream stm = tcpclnt.GetStream();
string eintrag = "";
int trennung = 0;

foreach (System.IO.FileInfo file3 in filelist)
{
	trennung += 1;
    if (file3.Name != "ersteTeil.txt")
    {
    	StreamReader file = new StreamReader(@"\Backup\Data\" + file3.Name, System.Text.Encoding.Default);
        eintrag += file.ReadToEnd();
        file.Close();
        int laeng = text.Length;
        string ausg = text;
        stream += ausg;
        if (trennung < filelist.Length)
        stream += "%";
    }
}

ASCIIEncoding asen = new ASCIIEncoding();
byte[] ba = asen.GetBytes(stream);
stm.Write(ba, 0, ba.Length);
byte[] message = new byte[100];
int bytesRead = 0;

bytesRead = stm.Read(message, 0, 100);
if (bytesRead > 0)
{
	label1.Text = "   Daten sind erfolgreich übertragen!";
}

Server:


int received = 0;
byte[] buffer;

do
{
	try
    {
    	buffer = new byte[Int32.MaxValue];
        received = socket.Receive(buffer);
                
        UTF8Encoding encoding = new UTF8Encoding();
        empfangen += encoding.GetString(buffer, 0, received);
        string toSend = "ACK";
        socket.Send(encoding.GetBytes(toSend));
    }
    catch (Exception exp)
    {
    	break;
    }
}
while (received != 0);

Grüße,
G.M.

16.842 Beiträge seit 2008
vor 7 Jahren

Nen Buffer auf 2GB zu setzen macht nicht wirklich viel sinn. Es ist schließlich nur ein Buffer.
Schau Dir an wie man vom Buffer einzelne Chunks liest.

Hat das einen Grund, dass Du wirklich mit Sockets arbeiten willst statt im TCP Layer weiter oben, wie WCF?
Es ist besser auf was etabliertes zu setzen, wenn man selbst nur so rudimentäre Features braucht aber die Umsetzung dann eher wackelig wäre.
Du musst da noch sehr viel selbst schreiben, dass das stabil läuft (zB das ganze Exception Handling, nen eigenes Protokoll entwickeln... etc).
Zudem bietet zC WCF bei Übertragung von Dateien schon von Haus aus Verschlüsselung und Kompression an.
Zwei Dinge, die heute nicht mehr ausser Acht gelassen werden dürfen - auch nicht im Intranet.

A
5 Beiträge seit 2008
vor 7 Jahren

Ich habe das gleiche Problem; teilweise erhalte ich vom Server sehr kurze Texte, teilweise etwas längere. Ein Erkennungszeichen für das Ende gibt es nicht,
eine Längenangabe ebenfalls nicht.
Den Server umstellen kann ich nicht, da es sich um Maschinen handelt, welche
teilweise noch mit OS/2 ausgestattet sind.
Ich habe keine Methode gefunden, welche mir es erlauben, den Buffer
"massgeschneidert" zu erstellen. Jetzt erzeuge ich den Buffer einfach für
den Grösstmöglichen Fall, und versuche danach den ungewollten Ballast
abzuschneiden.