Libuv fournit-il des facilités pour attacher un tampon à une connexion et le réutiliser

J’évalue libuv en tant que bibliothèque pour un serveur C / c ++ que j’écris. Le protocole est préfixé par la longueur, donc dès que je peux lire un entier de 32 bits dans le stream, je devrais être capable de dire quelle taille de mémoire tampon je devrais allouer. La documentation indique que la fonction uv_read_start peut être appelée plusieurs fois.

UV_EXTERN int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb, uv_read_cb read_cb);

Puisque j’utilise un protocole avec un préfixe de longueur, une fois que je connais la bonne taille de la mémoire tampon, j’aimerais l’allouer et l’utiliser de nouveau pour les lectures ultérieures jusqu’à ce que tous mes octets soient reçus. Y at-il un moyen facile de faire cela avec libuv? Pour le moment, il semble que la fonction uv_alloc_cb doit s’occuper de cela. Puis-je associer un tampon à mon object de stream au lieu de le placer dans une carte ou quelque chose de ce genre?

Comme j’utilise un protocole avec un préfixe de longueur, je ne voudrais pas du tout allouer de mémoire tampon tant que je ne pourrai pas lire les 4 premiers octets (32 bits). Est-il possible pour moi d’allouer sur la stack un tampon de taille 4 et de laisser la fonction uv_read_cb faire l’allocation de tas? La fonction uv_read_cb est-elle appelée de manière synchrone dans le cadre de la fonction uv_read_start? Si c’est le cas, alors je devrais être capable d’allouer sur la stack quand je sais que je n’ai pas déjà de tampon attaché à mon stream.

Répondre à ma propre question. J’ai trouvé les réponses sur la liste de diffusion libuv ici: https://groups.google.com/forum/#!topic/libuv/fRNQV_QGgaA

Copier les détails ici si le lien devient indisponible:

Attacher votre propre structure de données à un handle:

Le descripteur a un champ de void* data qu’il vous appartient d’utiliser. Vous pouvez le faire pointer vers une structure auxiliaire où vous stockez la longueur et le tampon.

Vous pouvez également intégrer uv_tcp_t dans une autre structure, puis rechercher la structure d’incorporation avec container_of. Ce n’est pas une macro C standard, mais vous pouvez trouver sa définition et ses exemples d’utilisation dans l’arbre libuv / source. Son avantage est qu’il ne fait que de l’arithmétique de pointeur, il vous permet d’économiser un autre niveau d’indirection de pointeur.

Allocation de stack pour le tampon de réception:

Non, ce n’est pas possible La bonne façon de penser est que votre alloc_cb retourne un tampon que libuv remplira avec des données à un moment donné. L’accent est mis sur “parfois” parce qu’il n’y a aucune garantie que cela se produise; il peut être immédiat, il peut être quelques secondes (ou minutes).