2011-01-13 9 views
3

Die Netzwerkbibliothek, die ich schreibe, muss Nachrichten über einen TCP-Socket senden und empfangen. Nachrichten können jederzeit gesendet oder empfangen werden, d. H. Sie sollten als Vollduplexkanal arbeiten.Wie implementiert man einen Vollduplex-Kanal über TCP mit einem einzigen Thread?

Ich war in der Lage, ein solches Szenario mit zwei Threads zu implementieren: Haupt-Thread-Aufruf send() und ein dedizierter Thread meist bei recv() Anruf blockiert.

Meine Frage ist: Ist es möglich, das gleiche Szenario mit einem einzigen Thread zu implementieren? I.e. durch Registrierung einiger Callback-Funktionen?

Als eine Randnotiz: Ich muss dieses Szenario in C++, Java und Python implementieren.

Antwort

4

Ja, es ist möglich. Sie müssen eine API verwenden, die Multiplex-E/A zulässt. Unter C/C++ und Python können Sie select() und nicht blockierende I/O verwenden, sodass der einzige Netzwerkanruf, den Sie jemals blockieren, select() ist. Es gibt auch poll() und epoll() und eine Reihe anderer ähnlicher APIs, die dasselbe erreichen, mit unterschiedlichem Grad an Effizienz und Portabilität. Java hat non-blocking I/O APIs auch.

Eine weitere Möglichkeit ist die Verwendung von asynchroner E/A, bei der Sie das Betriebssystem anweisen, eine E/A-Transaktion zu starten, und es (nach einem Mechanismus) benachrichtigt, wenn die Operation beendet ist. Ich bin mit dieser Art der Netzwerkprogrammierung jedoch nicht vertraut, daher werde ich nicht versuchen, Einzelheiten zu nennen.

0

Im Allgemeinen würde eine Bibliothek dies tun, indem sie eine Schnittstelle in die Hauptschleife/Ereignisschleife der Anwendung stellt.

Zum Beispiel würden die meisten single-threaded Netzwerk-Anwendungen eine Hauptschleife haben, die in select(), poll() oder ähnlich blockiert. Ihre Bibliothek würde nur einen Dateideskriptor zurückgeben, den die Anwendung in ihrem select()/poll() Aufruf enthalten sollte, und eine Rückruffunktion, die die Anwendung aufrufen sollte, wenn dieser Dateideskriptor lesbar ist.

Verwandte Themen