Question

NetworkStream.DataAvailable sait-il si le tampon d'envoi de l'expéditeur est vide? Ou indique-t-il simplement si le tampon de lecture du destinataire contient des données? Mon hypothèse est la dernière ...

Plus précisément, pour certains travaux de socket impliquant une conversation en cours, j’utilise actuellement un préfixe de longueur afin que le destinataire sache exactement combien de données se trouvent dans le lot en cours; Cependant, on m'a envoyé un .patch me suggérant d'utiliser NetworkStream.DataAvailable. Je crains que cela ne me dise que ce que le destinataire a reçu - et non ce que l'expéditeur a envoyé à l'origine - mais je ne suis pas un expert des sockets.

Est-ce que je me trompe? Ou préférez-vous le préfixe de longueur?

(remarque: je ne peux pas simplement lire () avant la fermeture du flux, car plusieurs lots sont envoyés sur la même connexion et il est essentiel de traiter chaque lot séparément, si je lis trop dans un lot ( même si elle est mise en mémoire tampon et rejetée), la conversation sera interrompue).

Était-ce utile?

La solution

Un côté d'une connexion ne saura pas si le tampon d'envoi de l'autre côté est vide.

DataAvailable indique uniquement si des données entrantes doivent être lues. Vous pouvez utiliser cela avant Read () , mais cela seul ne vous donne pas les informations que vous souhaitez. Cela ne vous dit pas le début et la fin de chaque lot.

J'ai déjà codé conversation avant et j'ai utilisé des préfixes de longueur dans les données. Ce que j’ai fait, c’est écrire des fonctions d’aide qui lisent un nombre exact d’octets (morceaux à la fois) et pas plus.

La seule alternative aux valeurs de longueur de lot dans le flux consiste à examiner les données entrantes et à reconnaître le début et la fin des lots.

Autres conseils

Si vous avez besoin de savoir quand le destinataire a reçu toutes les données d'un message particulier, vous devez absolument avoir un préfixe de longueur.

Je définis généralement une structure similaire à celle-ci, qui apparaît devant tous les messages binaires envoyés.

struct Header
{
  int packetIdentifier;
  int protocolVersion;
  int messageType;
  int payloadSize;
}

L'identifiant vous permet de déterminer si vous avez un message valide de votre type de protocole. La version vous permet de réviser votre protocole. Le type de message est le type de message (c'est-à-dire: CommsOnline). La taille de la charge utile est la taille du corps du message.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top