Schnelle Cross Platform Interprozesskommunikation in C ++
Ich bin auf der Suche nach einem Weg, um zwei Programme effizient zu übertragen eine große Menge an Daten zu jedem anderen, die arbeiten auf Linux und Windows in C++. Der Kontext hier ist ein P2P-Netzwerk-Programm, das wirkt wie ein Knoten im Netzwerk, und kontinuierlich läuft und bei anderen Anwendungen (Spiele, daher die Notwendigkeit für eine schnelle Lösung) verwenden diese, um die Kommunikation mit anderen Knoten im Netzwerk. Wenn es eine bessere Lösung gibt für diesen wäre ich interessiert.
InformationsquelleAutor der Frage Stephen Cross | 2010-02-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
boost::asio ist ein cross-Plattform-Bibliothek Behandlung von asynchronen io über sockets. Kombinieren Sie dies mit z.B. mit Google Protocol Buffers für Ihre eigentlichen Nachrichten.
Boost versorgt Sie auch mit boost::interprocess für die Kommunikation zwischen Prozessen auf derselben Maschine, aber asio mit der Sie Ihre Kommunikation asynchron und Sie können problemlos die gleichen Handler für lokale und remote-verbindungen.
InformationsquelleAutor der Antwort villintehaspam
Habe ich mit ICE von ZeroC (http://www.zeroc.com), und es war fantastisch. Super einfach zu bedienen, und es ist nicht nur plattformunabhängig, sondern hat die Unterstützung für viele Sprachen (python, java, etc) und sogar eine embedded-version der Bibliothek.
InformationsquelleAutor der Antwort rcv
Gut, wenn wir davon ausgehen, die zwei Prozesse auf dem gleichen Rechner laufen, dann ist der Schnellste Weg für Sie, um die übertragung großer Mengen von Daten hin und her ist durch das halten der Daten innerhalb einer shared memory region; mit diesem setup, die Daten werden nicht kopiert, da beide Prozesse können direkt auf ihn zugreifen. (Wenn man wollte sogar noch weiter gehen, Sie könnte kombinieren Sie die beiden Programme in einem Programm, mit dem jeder ehemalige 'Prozess' laufen jetzt so einen thread im gleichen Prozess Raum statt. In diesem Fall würden Sie automatisch teilen 100% Ihres Speichers mit jeder anderen)
Natürlich nur mit einer shared-memory-Bereich ist nicht ausreichend, in den meisten Fällen: Sie müssen auch eine Art von Synchronisierung Mechanismus, so dass die Prozesse Lesen und aktualisieren der freigegebenen Daten sicher, ohne Auslösung über einander. Die Art und Weise, die ich tun würde, wäre, erstellen Sie zwei double-ended-queues in der shared memory region (eine für jeden Prozess zu senden). Verwenden Sie entweder eine lockless FIFO-Warteschlange-Klasse, oder geben Sie jedem double-ended queue, ein semaphore/mutex, die Sie verwenden können, um die Serialisierung pushen von Daten Elemente in der Warteschlange und knallen die Daten aus der Warteschlange. (Beachten Sie, dass die Daten-Elemente, die Sie würde dabei sein, die in die Warteschlangen wäre nur Zeiger auf die eigentlichen Daten-Puffer, nicht aber die Daten selbst... sonst würden Sie zurück sein, um das kopieren großer Datenmengen um, die Sie vermeiden wollen. Es ist eine gute Idee, shared_ptrs statt eines einfachen C-Zeigern, so dass die "alten" Daten werden automatisch freigegeben, wenn der Empfang abgeschlossen ist, es zu verwenden). Sobald Sie dass haben, die einzige andere Sache, die Sie brauchen, ist ein Weg für Prozess A zu Benachrichtigen Prozess B, wenn es gerade ein Element in die Warteschlange für B zu empfangen (und Umgekehrt)... habe ich in der Regel tun, dass durch das schreiben eines Bytes in eine pipe, in die der andere Prozess ist select()-ing auf, um zu verursachen, der andere Prozess aufwachen und überprüfen Sie die Warteschlange, aber es gibt andere Möglichkeiten, es zu tun, wie gut.
InformationsquelleAutor der Antwort Jeremy Friesner
Dies ist ein hartes problem.
Der Flaschenhals ist das internet, und, dass Ihre Kunden möglicherweise auf NAT.
Wenn Sie nicht reden, internet, oder, wenn Sie dies ausdrücklich nicht-Kunden hinter carrier-grade-böse NATs, die Sie brauchen, zu sagen.
Weil es hinausläuft: die TCP verwenden. Suck it up.
InformationsquelleAutor der Antwort Will
Ich würde stark vorschlagen,Protocol Buffersdie auf TCP-oder UDP-sockets.
InformationsquelleAutor der Antwort Omnifarious
So, während die anderen Antworten decken ein Teil des Problems (socket-Bibliotheken), sind Sie nicht, erzählen Sie über die NAT-Problem. Anstatt Ihre Benutzer basteln mit Ihren Routern, ist es besser, verwenden Sie einige Techniken, sollten Sie durch eine vage vernünftigen router ohne extra Konfiguration. Sie müssen diese, um die beste Kompatibilität.
Erste, EIS Bibliothek hier ist ein NAT-traversal-Technik, arbeitet mit STUN und/oder SCHALTEN von Servern in das Netzwerk. Sie müssen möglicherweise einige Infrastruktur für diese zu arbeiten, obwohl es einige öffentliche STUN-Server.
Zweite, beide verwenden UPnP und NAT-PMP. Eine Bibliothek hierzum Beispiel.
Dritte, die Verwendung von IPv6. Teredo ist eine Möglichkeit der aktiven IPv6 über IPv4, oft funktioniert, wenn keine der oben genannten tun, und wer weiß, kann es sein, funktionierende IPv6 durch einige andere Mittel. Sehr wenig code um dies umzusetzen, immer wichtiger. Ich finde etwa die Hälfte der Bittorrent-Daten gelangt über IPv6, zum Beispiel.
InformationsquelleAutor der Antwort Andrew McGregor