Question

Le réseau lib Je familariser d'envoyer et de recevoir des messages via un socket TCP. Les messages peuvent être envoyés ou reçus en tout temps, i.e. devrait fonctionner comme un canal duplex intégral.

j'ai pu mettre en œuvre ce scénario en utilisant deux fils:. Thread principal appelant send () et un thread dédié essentiellement bloqué à l'appel recv ()

Ma question est: est-il possible de mettre en œuvre le même scénario avec un seul fil? C'est à dire. en vous inscrivant une fonction de rappel?

Comme une note de côté. J'ai besoin de mettre en œuvre ce scénario en C ++, Java et Python

Était-ce utile?

La solution

Oui, il est possible. Vous devez utiliser une API qui permet d'E / S multiplexé. Sous C / C ++ et Python, vous pouvez utiliser select () et E / S non-bloquant, de sorte que le bloc ne vous appel en réseau est jamais select (). Il y a aussi poll () et epoll () et un certain nombre d'autres API similaires qui accomplissent la même chose, avec des degrés d'efficacité et de portabilité. Java a non bloquant E / S API aussi.

Une autre possibilité est d'utiliser E / S asynchrone, où vous dites le système d'exploitation pour démarrer une transaction E / S et il vous avertit (par un mécanisme) lorsqu'il a terminé l'opération. Je ne suis pas au courant de ce style de programmation réseau, cependant, je ne vais pas essayer de donner des détails.

Autres conseils

En général, une bibliothèque ferait en fournissant une interface en boucle principale / boucle d'événements de l'application.

Par exemple, les applications utilisant le réseau le plus monothread aurait une boucle principale qui bloque dans select(), poll() ou similaire. Votre bibliothèque serait tout simplement revenir un descripteur de fichier que l'application doit inclure dans son appel select() / poll(), et une fonction de rappel que l'application doit appeler lorsque ce descripteur de fichier est lisible.

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