Ich bin auf der Suche nach einer Möglichkeit, zwei Programme zu erhalten, um eine große Menge von Daten effizient zu übertragen, die unter Linux und Windows in C++ arbeiten müssen. Der Kontext hier ist ein P2P-Netzwerkprogramm, das als ein Knoten in dem Netzwerk agiert und kontinuierlich läuft, und andere Anwendungen (die Spiele sein könnten, daher die Notwendigkeit einer schnellen Lösung) werden dies verwenden, um mit anderen Knoten in dem Netzwerk zu kommunizieren. Wenn es eine bessere Lösung dafür gibt, wäre ich interessiert.Fast Cross Plattform Inter Process Kommunikation in C++
Antwort
boost::asio ist eine plattformübergreifende Bibliothek, die asynchrone io über Sockets verarbeitet. Sie können dies zum Beispiel mit Google Protocol Buffers für Ihre tatsächlichen Nachrichten kombinieren.
Boost bietet Ihnen auch boost::interprocess für Interprozesskommunikation auf dem gleichen Rechner, aber asio können Sie Ihre Kommunikation asynchron durchführen und Sie können leicht die gleichen Handler für lokale und Remote-Verbindungen haben.
yep, gewinnende Kombination –
Ok, sieht aus wie Boost ist der Weg zu gehen mit ... Ich benutze es bereits für Boost :: Signal und ich würde es wahrscheinlich für boost :: asio –
Mit Google Protocol Buffers verwenden Sie können unter [viele verfügbare RPC-Implementierungen] (http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns) auswählen. –
Dies ist ein schweres Problem.
Der Engpass ist das Internet, und Ihre Kunden könnten auf NAT sein.
Wenn Sie nicht Internet sprechen, oder wenn Sie explizit keine Kunden hinter bösartigen NATs der Carrier-Klasse haben, müssen Sie sagen.
Weil es läuft auf: TCP verwenden. Sauge es auf.
Die beiden Prozesse laufen auf demselben Rechner, aber einer kommuniziert mit dem Internet. Der andere Prozess muss mit diesem kommunizieren, um Daten im P2P-Netzwerk zu senden. –
Aha, und ich dachte, dass die Frage war, wie man ein P2P-Netzwerk macht. Ich habe noch nicht einmal angefangen auf Lochen und Relaisservern und so weiter. – Will
Ich würde dringend Protocol Buffers oben auf TCP oder UDP-Sockets vorschlagen.
Während UDP unter bestimmten Umständen gut sein kann, ist TCP der Weg zu gehen, wenn Sie die Daten dort in einem Stück wollen und Latenz ist nicht die kritischste Komponente. – Xorlev
Ich habe ICE von ZeroC (www.zeroc.com) verwendet, und es war fantastisch. Super einfach zu bedienen, und es ist nicht nur plattformübergreifend, sondern unterstützt auch viele Sprachen (Python, Java usw.) und sogar eine eingebettete Version der Bibliothek.
ICE erfordert entweder, dass Sie Ihr Programm unter GPL veröffentlichen oder eine kommerzielle Lizenz kaufen, die für das OP problematisch sein kann oder auch nicht. – villintehaspam
Das Programm selbst wird unter der GPL lizenziert, so dass dies kein Problem ist –
ZeroC nutzt Google Protocol Buffers. –
Also, während die anderen Antworten einen Teil des Problems abdecken (Socket-Bibliotheken), sagen sie Ihnen nichts über das NAT-Problem. Anstatt Ihre Benutzer an ihren Routern herumzubasteln, ist es besser, einige Techniken zu verwenden, die Sie durch einen vage gesunden Router ohne zusätzliche Konfiguration bringen sollten. Sie müssen alle diese verwenden, um die beste Kompatibilität zu erhalten.
Erstens, ICE library here ist eine NAT Traversal-Technik, die mit STUN und/oder TURN-Server im Netzwerk funktioniert. Möglicherweise müssen Sie dafür einige Infrastruktur bereitstellen, obwohl einige öffentliche STUN-Server vorhanden sind.
Zweitens, verwenden Sie beide UPnP und NAT-PMP. Eine Bibliothek here, zum Beispiel.
Drittens IPv6 verwenden. Teredo, eine Möglichkeit, IPv6 über IPv4 zu betreiben, funktioniert oft, wenn keines der oben genannten Programme funktioniert, und wer weiß, dass Ihre Benutzer IPv6 auf andere Weise verwenden. Sehr wenig Code, um dies zu implementieren, und zunehmend wichtig. Ich finde, dass etwa die Hälfte der Bittorrent-Daten über IPv6 ankommt.
Nun, wenn wir davon ausgehen können, dass die beiden Prozesse auf der gleichen Maschine laufen, dann ist der schnellste Weg für sie, große Datenmengen hin und her zu übertragen, indem die Daten in einem gemeinsamen Speicherbereich gehalten werden; Bei diesem Setup werden die Daten niemals kopiert, da beide Prozesse direkt darauf zugreifen können. (Wenn Sie noch weiter gehen wollten, könnten Sie die beiden Programme in einem Programm kombinieren, wobei jeder frühere 'Prozess' jetzt als ein Thread im selben Prozessraum läuft.In diesem Fall würden sie automatisch 100% ihres Speichers miteinander teilen)
Natürlich reicht es in den meisten Fällen nicht, einen gemeinsamen Speicherbereich zu haben: Sie benötigen auch eine Art von Synchronisationsmechanismus, so dass der Prozesse können die gemeinsam genutzten Daten sicher lesen und aktualisieren, ohne sich gegenseitig auszulösen. Die Art und Weise, wie ich das tun würde, wäre, zwei doppelendige Warteschlangen in der geteilten Speicherregion zu erzeugen (eine für jeden zu sendenden Prozess). Verwenden Sie entweder eine blocklose FIFO-Queue-Klasse oder geben Sie jeder Double-Ended-Queue einen Semaphor/Mutex, mit dem Sie Datenelemente in die Queue schieben und Datenelemente aus der Queue ziehen können. (Beachten Sie, dass die Datenelemente, die Sie in die Warteschlangen einfügen, nur Zeiger auf die eigentlichen Datenpuffer und nicht die Daten selbst sind. Andernfalls würden Sie große Datenmengen kopieren, die Sie vermeiden möchten Es ist eine gute Idee, shared_ptrs anstelle von einfachen C-Zeigern zu verwenden, so dass "alte" Daten automatisch freigegeben werden, wenn der Empfangsprozess damit fertig ist. Sobald Sie das haben, ist die einzige andere Sache, die Sie benötigen, eine Möglichkeit für Prozess A, Prozess B zu benachrichtigen, wenn er gerade ein Element in die Warteschlange für B gesetzt hat (und umgekehrt) ... Normalerweise mache ich das Schreiben eines Bytes in eine Pipe, auf die der andere Prozess selektiert wird, um den anderen Prozess aufzuwecken und seine Warteschlange zu überprüfen, aber es gibt auch andere Möglichkeiten, dies zu tun.
Ich bin ein wenig unsicher über die Frage ... Fragen Sie über die Übertragung von Daten zwischen zwei Prozessen auf dem gleichen Host oder zwei Prozesse, die auf verschiedenen Hosts laufen (oder sein könnten)? –
Wenn Sie nach einer besseren Lösung suchen, was machen Sie jetzt? – ergosys
@ Jeremy: Entschuldigung, ich war nicht klar genug. Die zwei Prozesse befinden sich auf derselben Maschine. –