Question

Dans Twisted lors de l’implémentation de la méthode dataReceived, il ne semble pas exister d’exemple faisant référence à la fragmentation de paquets. Dans tous les autres langages, c'est quelque chose que vous implémentez manuellement, alors je me demandais si cela était déjà fait pour vous en tordu ou quoi? Si oui, dois-je préfixer mes paquets avec un en-tête de longueur? Ou dois-je le faire manuellement? Si oui, de quelle manière s'agirait-il?

Était-ce utile?

La solution

Dans la méthode dataReceived, vous récupérez les données sous forme d'une chaîne de longueur indéterminée, ce qui signifie qu'il peut s'agir d'un message entier dans votre protocole ou d'une partie seulement du message envoyé par un "client". Vous devrez examiner les données pour voir si elles contiennent un message complet dans votre protocole.

J'utilise actuellement Twisted sur l'un de mes projets pour implémenter un protocole et j'ai décidé d'utiliser le module struct pour compresser / décompresser mes données. Le protocole que je suis en train d'implémenter a une taille d'en-tête fixe, je ne construis donc aucun message avant d'avoir lu au moins HEADER_SIZE nombre d'octets. La taille totale du message est déclarée dans cette partie de données d'en-tête.

Je suppose que vous n'avez pas vraiment besoin de définir une longueur de message dans le cadre de votre protocole, mais cela aide. Si vous n'en définissez pas un, vous devrez disposer d'un délimiteur spécial qui détermine le début et la fin d'un message. Triez comment le protocole FIX utilise l'octet SOH pour délimiter les champs. Bien qu'il comporte un champ obligatoire qui vous indique la longueur d'un message (mais pas le nombre de champs dans un message).

Autres conseils

Lorsque vous utilisez TCP, vous devriez vraiment oublier toute notion de "paquets". TCP est un protocole de flux - vous diffusez des données et les flux de données sortent de l'autre côté. Une fois que les données sont envoyées, il est permis d’arriver dans autant de blocs que nécessaire, à condition que toutes les données arrivent dans le bon ordre. Vous devrez manuellement faire la délimitation comme avec d’autres langues, avec un champ de longueur, un champ de type de message, un caractère de délimitation spécial, etc.

Vous pouvez également utiliser un protocole LineReceiver

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