Laden...

Socket buffer addieren und prüfen ob alle Daten vorhanden sind.

Erstellt von Dasart vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.449 Views
D
Dasart Themenstarter:in
25 Beiträge seit 2010
vor 13 Jahren
Socket buffer addieren und prüfen ob alle Daten vorhanden sind.

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 ?

3.170 Beiträge seit 2006
vor 13 Jahren

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

D
Dasart Themenstarter:in
25 Beiträge seit 2010
vor 13 Jahren

Danke werde mich gleich mal ransetzten und es damit versuchen.