Comment mettre en place un canal duplex intégral sur TCP avec un seul fil?
-
10-10-2019 - |
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
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.