Guten Tag
Ich Programmiere gerade ein Netzwerkprogramm. Nun bin ich schon so weit das sich Verbindungen zwischen den Sockets aufbauen, dass Textnachrichten gesendet werden können, dass durch Senden eines bytes überprüft wird ob Server/Client noch online sind.
Das erste Problem habe ich schon gelöst. Dabei handelte es sich darum, das die "Pings" also null byter zwischen den Normalen bytes der Nachricht standen, beim Empfangen, geh ich einfach den kompletten Buffer durch und kopiere alle bis auf die "null bytes" in ein anderes Array.
Aber nun ein Problem.
Ich Prüfe immer alle 1000ms ob Daten zum "Abholen" bereit sind. Das Funktioniert zwar bei Textnachrichten ziemlich gut aber wenn ich Daten Senden will bekomm ich Probleme, weil in 1000ms einfach nicht alle Daten geschickt werden können.
Mein Ansatz ist so :
Ich habe ein Protokoll mit Volgendermaßener "Syntax"
[Kommando][Länge der Nachricht][Eigentliche Nachricht/Datei]
Kommando = 1 byte
Länge der Nachricht = 4bytes
Nachricht = Variable
Das Protokoll ist nicht das Problem aufzustellen, funktioniert bei Textnachrichten auch gut, ich müsste nur wissen wie ich es schaffe wirklich auf Alle Daten zu warten und bei zuvielen Daten die überstehenden Daten wieder in den "normalen" buffer zu schreiben.
Wie löse ich das Problem am besten ?
Hallo,
Du kannst in einer Schleife in einen Puffer fester Größe immer wieder einlesen.
Dann brauchst Du noch einen großen Puffer, der alle Daten aufnehemen kann. Dafür eignet sich z. B. ein MemoryStream
.
Also etwa so (nicht getestet):
MemoryStream data = new MemoryStream();
byte[] buffer = new byte[1024];
int count = 0;
do
{
count = socket.Receive(buffer,buffer.Length,0);
data.Write(buffer, 0, count);
}while(count > 0);
EDIT: Danach müsste der MemoryStream das komplette Paket inkl. Protokolldaten enthalten. Dann kannst Du die Länge aus dem Protzokoll gegen die Länge des Streams vergleichen, um festzustellen, ob Du alles bekommen hast.
Lies auch den Abschnitt Hinweise in Socket.Receive-Methode
Noch eine Anmerkung: Wenn Du Binärdaten versenden willst, können ja da auch Nullbytes drinstehen. Die alle einfach rauszunehmen wird also nicht klappen.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca