Je suis en train de réécrire du code pour gérer certaines communications embarquées et maintenant le traitement du protocole est implémenté dans une boucle While avec une grosse instruction case/switch. Cette méthode semble un peu lourde. Quelles sont les méthodes de contrôle de flux les plus couramment utilisées pour implémenter des protocoles de communication?Quels sont les contrôles de flux les plus fréquemment utilisés pour gérer la communication de protocole?
Répondre
Pour les cas où vous saisissez un champ dans un en-tête de protocole pour vous diriger vers l'étape de traitement suivante pour ce protocole, des tableaux de pointeurs de fonction peuvent être utilisés. Vous utilisez la valeur de l'en-tête de protocole pour indexer dans le tableau et appelez la fonction pour ce protocole.
Vous devez gérer toutes les valeurs possibles dans ce tableau, même celles qui ne sont pas valides. Finalement, vous obtiendrez un paquet contenant la valeur invalide, soit parce que quelqu'un essaie une attaque ou parce qu'un futur rev du protocole ajoute de nouvelles valeurs.
Si tout un protocole est géré, alors une déclaration switch/case peut être votre meilleur pari. Cependant, vous devez séparer tous les gestionnaires de messages individuels dans leurs propres fonctions.
Si votre instruction switch contient du code pour gérer réellement les messages, il vaut mieux les supprimer. Si elle gère plusieurs protocoles similaires, vous pouvez créer une classe pour gérer chacun d'entre eux en fonction de la même classe abstraite. Lorsque la connexion est établie, vous pouvez déterminer le protocole et créer une instance de la classe de gestionnaire appropriée à décoder. et gérer les communications.
Je pense que cela dépend en grande partie de la langue que vous utilisez, et du type d'objets de données que vous avez à votre disposition.
En python, par exemple, vous pouvez créer un objet Dictionary de toutes les différentes instructions de gestion, et parcourir juste cela pour trouver la bonne méthode/fonction à appeler. Les instructions Case/Switch ne sont pas mauvaises, mais si elles sont énormes (comme elles le peuvent avec d'énormes quantités de gestionnaires de protocole), elles peuvent devenir difficiles à manipuler.
Il semble que le "while + switch/case" est une implémentation d'un statemachine. Je crois qu'une machine à écrire bien pensée est souvent la façon la plus simple et la plus facile de mettre en œuvre un protocole.
Quand il s'agit de statemachines, la rupture de certaines règles de programmation traditionnelles vient avec le territoire. Des règles telles que "chaque fonction doit comporter moins de 25 lignes" ne fonctionnent tout simplement pas. On pourrait même prétendre que les machines à sous sont des GOTO déguisés.
- 1. Commandes Ajax les plus fréquemment utilisées
- 2. Quels sont les types de chaînes les plus utilisés en C++ et comment les convertir?
- 3. Quels sont les algorithmes courants utilisés pour rand() de C?
- 4. Quels types de contrôles sont utilisés dans Windows Security Center?
- 5. Quels modèles de conception sont sous-utilisés?
- 6. Quels sont les algorithmes utilisés par les SGBDR?
- 7. Motifs de conception: quels sont les nouveaux, où sont utilisés les modèles existants?
- 8. Quels sont les frameworks iPhone tiers les plus utiles?
- 9. Quels sont les algorithmes d'ordonnancement utilisés par le noyau Linux?
- 10. Quels sont les bons modules Perl pour la programmation basée sur les flux sur les fichiers?
- 11. log4net, la journalisation, quels sont les plus grands avantages
- 12. Quels protocoles TCP sont utilisables pour la communication client-client?
- 13. Quels sont les tags HTML valides dans les flux RSS?
- 14. Quels sont les avantages des contrôles de contenu MS Word?
- 15. Quels sont les programmes RoR utilisés dans ce tutoriel?
- 16. Quels sont les codes de balayage pour:
- 17. Quels types de tests unitaires sont les plus rentables?
- 18. Quels sont les plus grands avantages de LLVM?
- 19. Quels sont vos alias de consoles les plus importants?
- 20. Obtenez les applications les plus fréquemment utilisées dans VB.NET
- 21. Où sont utilisés les algorithmes de gestion de la mémoire?
- 22. Quels sont les modèles pour les schémas de table DB?
- 23. Quels sont les plugins recommandés pour Trac?
- 24. Quels sont les tutoriels les plus simples/les meilleurs pour se familiariser avec SQLAlchemy?
- 25. Quels sont les attributs?
- 26. Quels sont les tutoriels et les vidéos OpenSocial les plus utiles pour apprendre?
- 27. Quels sont les forums/blogs Ruby les plus actifs sur le net?
- 28. Quels sont les CMS pour mobile?
- 29. Quels sont les moyens génériques de rendre les services de reporting plus rapides?
- 30. Quels sont les objets IB utilisés dans le carnet d'adresses de Mac OS X?