Libev, Comment passer des arguments à des rappels pertinents

Je suis pris au piège dans une situation de dispute qui passe chez libev.

Généralement, libev reçoit les paquets dans une fonction comme * receive_callback * , ce n’est pas grave , mais en pratique, nous devons envoyer un * write_callback * relatif pour traiter des tâches spécifiques en fonction du paquet reçu. Par exemple:

S_RECV_MSG* pstRecvMsg = (S_RECV_MSG*) recv_buff; switch(pstRecvMsg->wMsgType) { case 1: ev_io_init(w, write_callback1, w->fd, EV_WRITE); break; case 2: ev_io_init(w, write_callback2, w->fd, EV_WRITE); break; case 3: // ....... } 

Ma question est la suivante: si write_callbackX doit également lire le contenu spécifique dans recv_buff, comment pouvons-nous passer l’argument recv_buff à callbackX? Devons-nous supporter le fardeau et la laideur des variables globales ici?

    L’auteur y a répondu lui-même, mais dans un commentaire. Comme cela apparaît comme sans réponse, je poste sa réponse dans la section “réponse” et ferme la boucle. Vous ne savez pas s’il existe un meilleur moyen … n’hésitez pas à résoudre ce problème.

    L’auteur de la question dit:

    Désolé, je pense avoir la réponse maintenant et je me sens profondément honteux de mon négligence dans la lecture de la documentation:

     struct my_io{ ev_io io; int otherfd; void *somedata; struct whatever *mostinteresting; }; // ... struct my_io w; ev_io_init (&w.io, my_cb, fd, EV_READ); 

    Et ensuite, nous utilisons le my_io comme ceci:

     static void my_cb (struct ev_loop *loop, ev_io *w_, int revents) { struct my_io *w = (struct my_io *)w_; //... } 

    Oui, c’est expliqué dans le document libev, et il existe un autre moyen. Chaque observateur a un membre de données void * que vous pouvez lire ou modifier, et libev l’ignorera complètement. Vous pouvez ainsi passer l’argument comme suit:

     w->data = (void *)recv_buff; ... static void my_cb (struct ev_loop *loop, ev_io *w_, int revents) { S_RECV_MSG *recv_buff = (S_RECV_MSG*)w_->data; ... } 

    voir le document libev .