Comment écrire un petit écart dans networkstream?

J’ai un serveur qui envoie des données de télémésortinge de taille variable à des récepteurs ou, comme je les appellerai, des clients, via NetworkStream . Je vise une vitesse maximale, alors je veux des délais minimaux. La fréquence est incontrôlable, donc je voudrais utiliser une boucle infinie dans mes clients, qui utilise NetworkStream.Read pour lire les données, les traiter, puis répéter.

Mon problème est que parfois, si deux paquets sont envoyés très rapidement et qu’un client dispose d’une connexion Internet lente, les deux paquets seront reçus sous forme de stream continu, ce qui entraînera des données non traitables. Une demi-solution que j’ai trouvée (principalement pour confirmer que c’est bien l’erreur) est d’avoir un petit délai après / avant chaque transmission, en utilisant System.Threading.Thread.Sleep(100) , mais pas seulement je trouve Sleep une solution de botchy , il est incohérent, car il ralentit également les clients avec une bonne connexion, et le problème peut persister avec une connexion encore pire.

Ce que je voudrais faire, c’est que le serveur envoie un intervalle entre chaque transmission, fournissant une séparation quelle que soit la vitesse de l’internet, comme NetworkStream.Read devrait se terminer une fois le stream continu terminé. Je ne comprends pas le fonctionnement d’un NetworkStream et je ne sais pas à quoi ressemblent quelques octets de stream vide ou comment il pourrait être implémenté. Des idées?

Vous ne mentionnez pas spécifiquement le ProtocolType que vous utilisez sur votre NetworkStream mais TCP est lié à vos besoins. Les routeurs / commutateurs intermédiaires n’ont aucun moyen de savoir que votre intention est de séparer les paquets en fonction du temps et qu’ils ne respecteront pas ce désir. De plus, le protocole TCP, orienté stream, fournit des paquets en ordre et corrige les erreurs de paquets et de paquets corrompus. A chaque occurrence de l’un ou de l’autre, il contiendra tous les paquets supplémentaires jusqu’à ce que le paquet d’erreur soit retransmis – et vous les retrouverez probablement tous dans un tas.

Utilisez UDP et implémentez la limitation du côté réception (c.-à-d. Du client) – en rejetant des données si vous êtes en retard.

Je vous conseille vivement de changer le protocole si vous le pouvez. TCP est un protocole basé sur un stream, et toute tentative d’ignorer efficacement ce qui risque de ne pas être fiable.

Au lieu de cela, je suggère de changer pour en faire un stream de messages où chaque message a un préfixe indiquant la longueur du corps du message. De cette façon, peu importe si un message particulier est divisé entre plusieurs paquets ou reçu dans le même paquet que les autres messages. Cela facilite également la lecture pour les clients: ils savent exactement combien de données doivent être lues, et peuvent donc simplement le faire en boucle.

Si vous craignez que le préfixe de longueur introduise trop de surcharge (si les données sont souvent petites), vous pourriez rendre le protocole légèrement plus compliqué avec un seul message contenant un lot complet d’informations (plusieurs éléments de télémésortinge).

Mais fondamentalement, il vaut la peine de supposer que les données seront divisées en plusieurs paquets, combinés à nouveau, etc. Ne supposez pas qu’une opération d’écriture correspond à une opération de lecture.