Frage

Ich habe ein paar einfache Fragen, ich habe eine Client-Server-Anwendung und auf dem Draht gesendeten Daten.

Ich möchte in der Lage sein, die Daten wiederherzustellen und es ordnungsgemäß zu behandeln.

struct T1
{
   int id;
   int foo;
};

struct T2
{
  int id;
  char foo;
  int bar;
};

Lassen Sie uns nehmen diese Strukturen, werden sie auf das Netzwerk von einem int voraus gesendet, wenn erzählen entweder T1 oder T2 folgt. Wenn die Client-T1 schickt mir, sendet dann ich T2, habe ich die Gewissheit, dass ich eine vollständige Struktur mit asio :: ip :: tcp :: socket.async_read lesen kann ()? Ich mag einen Handler einzurichten, die eine einzige Struktur behandelt, aber was passiert, wenn ich nicht in der Lage bin, alles in einem einzigen async_read zu lesen ()?

  

Die asynchrone Operation wird   bis eines der folgenden fortsetzen   Bedingungen erfüllt ist:

     
      
  • Die mitgelieferten Puffer voll sind. Das heißt, die übertragene Bytes zu der Summe der Puffergrößen entsprechen.
  •   
  • ist ein Fehler aufgetreten.
  •   

Wird es verwerfen die Daten, die nicht gelesen werden kann? wird es eine weitere async_read auslösen? Und, bin ich sicher sein, dass ein async_read nur eine ID + Struktur erhalten, wenn mein Kunde mir sendet sequentiell die ID + Struktur? Oder kann das OS optimize Dinge und legte sie beide im selben Paquet? Wie Sie gesehen haben, ich bin ein wenig verwirrt, würde Ich mag die richtigen Entscheidungen zu treffen, wenn ein Server / Client-Anwendung entwerfen, wird jede Hilfe dankbar.

Danke.

War es hilfreich?

Lösung

EDIT: Danke für den Hinweis auf einen Fehler @timo. async_read wird erst abgeschlossen, wenn eine gesamte Struktur gelesen wird, so dass Sie nicht in einer Schleife brauchen. Ansonsten ist meine Antwort gleich. Nichts geht verloren, unabhängig davon, wie das TCP-Protokoll aufbricht oder verschmilzt die Daten.

Wenn es nicht genügend Daten in dem TCP-Puffer ist der Eingangspuffer zu füllen, wird die Lese einfach holen, was verfügbar ist, und berichtet über die Anzahl von Bytes geholt. Was dann geschieht, ist Ihnen überlassen. Sie könnten genügend Daten in den abgerufenen Bytes haben Sie weiterhin nicht entscheiden wollen, macht so Asio keine Annahmen. Wenn Sie nicht genug Bytes gelesen haben eine komplette Struktur umfassen, initiieren dann eine weitere async_read, wiederholt den Vorgang, bis Sie genug Bytes oder etwas stirbt haben.

Ich bin nicht sicher, was Sie unter „nicht in der Lage, alles zu lesen.“ zwei mögliche Bedeutungen in den Sinn kommen:

  1. Die Menge an Daten, die zu lesen verfügbar ist nicht eine Struktur füllen. In diesem Fall müssen Sie einfach eine andere read_async tun, um weitere Daten zu warten zu gelangen.
  2. Die Struktur absorbiert nicht alle, dass Daten, die angekommen ist. Der TCP-Stack einfach ungelesene Daten puffern, bis Sie es zu lesen bekommen um.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top