2012-12-20 8 views
7

Ich richte eine Möglichkeit ein, zwischen einem Server und einem Client zu kommunizieren. Wie ich es im Moment arbeite, ist, dass ein erstes Byte Stream wird ein Indikator für das enthalten, was und dann kommt dieser Antrag Klasse aufzublicken ich die Länge des Antrags bestimmen kann:Wie platziere ich ein Trennzeichen in einem NetworkStream-Byte-Array?

stream.Read(message, 0, 1) 

if(message == <byte representation of a known class>) 
{ 
    stream.Read(message, 0, Class.RequestSize); 
} 

Ich bin gespannt wie man den Fall behandelt, wenn die Klassengröße nicht bekannt ist, ob nach dem Lesen einer bekannten Anfrage die Daten korrupt sind.

Ich denke, dass ich in eine Art Trennzeichen in den Stream einfügen kann, aber da ein Byte nur zwischen 0-255 liegen kann, bin ich nicht sicher, wie man ein eindeutiges Trennzeichen erstellt. Soll ich ein Muster in den Stream einfügen, um das Ende einer Nachricht darzustellen? Wie kann ich sicher sein, dass dieses Muster einzigartig genug ist, um nicht mit tatsächlichen Daten verwechselt zu werden?

+1

Teilen Sie Ihren Stream in fester Größe ** Chunks ** (sagen wir zum Beispiel 64K). Stellen Sie 2 Bytes für jeden Chunk mit der aktuellen Größe bereit, wenn Sie einen Chunk erhalten, bei dem dieser Wert nicht 0xFFFF ist, dann haben Sie das Ende des Streams erreicht. Versuchen Sie nicht, ein eindeutiges Muster zu haben, es ist sicher, dass es gebrochen wird **, es sei denn, Sie kodieren Ihre Eingabedaten (aber das wird sie größer machen). –

+0

@Adriano mit Ihrem Ansatz Wie würde ich verhindern, dass jemand bis zum Ende der Zeit 0xFFFF Größen sendet? – afuzzyllama

+0

Wenn Absender böswillig nein ist, können Sie nicht (außer Sie setzen ein willkürliches Limit). Wenn Sie jedoch einen zusätzlichen Zähler (vor dem ersten Chunk) mit der Anzahl der zu sendenden Chunks erhalten können (dies begrenzt auch die maximale Größe). Ich würde jedoch zweimal überlegen, ob diese Art der Überprüfung auf Datenintegrität hinzugefügt wird oder nicht. Diese Art von Stuffs werden vom Protokoll ** auf niedrigerer Ebene behandelt (verwenden Sie eine TCP-Verbindung?). –

Antwort

4

Es gibt verschiedene Ansätze dazu. Eine Option wäre, zuerst die Länge des Klassennamens und möglicherweise des gesamten Pakets zu senden (z. B. immer das erste Byte). Auf diese Weise können Sie nur dieses Byte und dann weitere n Bytes lesen, um den Klassennamen zu erhalten.

Durch diesen Ansatz, den Sie am Ende nicht eine viel Sachen Lesen ein böswilliger Client Sie mit der Absicht zu DoS sendet Ihre Anwendung und Sie können schnell feststellen, ob Sie genug lesen, das Paket zu behandeln, oder wenn es noch nicht ist Komplett.

-1

Es gibt einige Low-Level-Bytes, die besonders als Trennzeichen verwendet werden. Anfang von Text und Ende von Text haben einen (hex) Wert von 0x02 bzw. 0x03. Und Sie haben Anfang der Überschrift gekoppelt mit Ende der Übertragung, 0x01 und 0x04; Du könntest diese benutzen.

+3

Nur wenn garantiert ist, dass seine Daten niemals diese Zeichen enthalten. Wenn es sich um binäre Daten handelt, ist das nicht der Fall. – ThiefMaster

+0

Na klar, aber das hängt von seinen Daten ab, ich denke, es ist in Ordnung, das zumindest zu erwähnen. – Davio

Verwandte Themen