Gibt es einen „schönen“ Weg mit Zusammenbauen Multicasts aus mehreren Quellen umgehen?

StackOverflow https://stackoverflow.com/questions/346650

Frage

Ich bin derzeit bestehende eigenen Socket-Wrapper-Code Nacharbeiten Boost Asio zu verwenden, so dass es einige des schweren Hebens für uns tun kann. Vielleicht ist der komplexeste Bereich unseres vorhandenen Code ist der Multicast-Code verarbeitet. Der Code ermöglicht es unser Middle-Tier-Server (von denen es kann ich viele in einem System) Multicasts Client-Boxen zu senden, die diese verwenden, um Updates zu den Benutzern des Systems zu präsentieren.

Der Grund der Code komplex und fehleranfällig ist, ist, dass es eine Reihe von rohen Puffer verwendet die Multicast-Streams wieder zusammenzusetzen je nachdem, wo sie von gekommen. Es scheint, dass auch bei Boost.Asio Ich werde mit dem gleichen Problem zu tun haben, also, bevor ich stecken in ich dachte, es würde sich lohnen, zu fragen, wie andere Menschen mit dieser Situation beschäftigt haben.

Es scheint wie ein sehr häufiger Anwendungsfall. Gibt es irgendetwas gibt, die mich erledige diese Aufgabe ohne die Art von Code jetzt habe ich helfen kann? Oder gibt es eine etablierte C ++ Vorlage (Boost-oder nicht), dass diese Art von Arbeit tun?

Natürlich könnte ich die Dinge einfacher auf mich machen und STL-Container verwenden, um die Pakete anstelle von Roh-Arrays Puffer, aber dieser Code muss wirklich hohe Leistung. Bei großen Installationen eine große Anzahl von Paketen gibt es herumfliegen und es muss so nahe an Echtzeit wie möglich reagieren zu können.

Vielen Dank im Voraus für alle Gedanken zu diesem Thema.

Jamie

War es hilfreich?

Lösung

Es klingt nicht wie Sie genügend Informationen für ausführliche Antworten gegeben haben, aber es gibt ein paar allgemeinen Hinweise für Echtzeit-Verarbeitung von Multicast-Daten zu berücksichtigen.

  • Wenn Sie rohen UDP-Multicast verwenden, tun Sie wahrscheinlich eine Art von Protokoll-Sequenzierung in User-Space, um mit verlorenen oder dupliziert Paketen zu behandeln. Was auch immer Optimierungen Sie tun mögen, die Versuchung widerstehen brechen die Schichtung zwischen der Anwendung und Ihrer Protokollschicht.
  • std::vector, für die meisten Zwecke ist identisch mit einem rohen dynamisch zugewiesenen Zeichenpuffer. Sie scheuen sich nicht von der Nutzung, nur weil es eine Abstraktionsschicht ist. Es gibt zwei Fälle, in denen man es vermeiden soll, aber:
    • Wenn Sie mit statisch zugewiesenen Puffer wegkommen kann
    • Wenn Sie Eigentum des Puffers übertragen müssen stromabwärts (obwohl, wenn Sie carefuly entwerfen, swap() ausreichend sein kann)
  • Vorbelegung ist dein Freund. Wenn Sie eine Reihe von Puffern zur Verfügung für die Nutzung haben können, wenn Daten in kommen, können Sie die meisten dynamische Zuordnung von dem schnellen Weg der Ausführung entfernen.
  • Minimieren Speicherkopien. Wenn Sie Daten in einem einzigen Call-Stack verarbeiten können, haben Sie die Möglichkeit, Kopien zu vermeiden. Wenn Sie Daten aus, um einen anderen Thread zu übergeben, können Sie gezwungen werden, Daten zu kopieren.
  • Wenn Ihre Anwendung kann chunked Puffer behandeln (und nicht alle Daten in einem einzigen Puffer aggregieren), schauen Sie in writev und readv.

Das glaube ich nicht in Dosen Lösung Ihrer Probleme lösen. Steigern Sie ASIO, libevent usw. werden alle Sockel Abstraktionen für Sie erledigen, aber was Sie tun, mit Ihren Daten ist nach wie vor in Ihrer Verantwortung, sobald es geliefert worden ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top