C'è un & # 8220; bello & # 8221; modo di gestire il riassemblaggio di multicast da più fonti?

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

Domanda

Attualmente sto rielaborando il nostro attuale codice wrapper socket proprietario per utilizzare boost asio in modo che possa fare un po 'di lavoro pesante per noi. Forse l'area più complessa del nostro codice esistente è il codice di gestione multicast. Il codice consente ai nostri server di livello intermedio (di cui ce ne sono molti in un unico sistema) di inviare multicast alle caselle client, che li utilizzano per presentare gli aggiornamenti agli utenti del sistema.

Il motivo per cui il codice è complesso e soggetto a errori è che utilizza un numero di buffer non elaborati per riassemblare i flussi multicast in base alla loro provenienza. Sembra che anche con Boost.Asio dovrò affrontare lo stesso problema, quindi prima di rimanere bloccato ho pensato che varrebbe la pena chiedere come gli altri hanno affrontato questa situazione.

Sembra un caso d'uso molto comune. C'è qualcosa là fuori che può aiutarmi a fare questo lavoro senza il tipo di codice che ho ora? Oppure esiste un modello C ++ consolidato (Boost o altro) che può fare questo tipo di lavoro?

Ovviamente potrei rendere le cose più facili su me stesso e usare i contenitori STL per bufferizzare i pacchetti invece che array grezzi, ma questo codice deve avere prestazioni davvero elevate. Su installazioni di grandi dimensioni ci sono molti pacchetti che volano in giro e devono rispondere il più vicino possibile al tempo reale.

Grazie in anticipo per eventuali pensieri in merito.

Jamie

È stato utile?

Soluzione

Non sembra che tu abbia fornito informazioni sufficienti per risposte dettagliate, ma ci sono alcuni suggerimenti generali da considerare per la gestione in tempo reale dei dati multicast.

  • Se stai usando il multicast UDP non elaborato, probabilmente stai eseguendo una sorta di sequenziamento del protocollo nello spazio utente per gestire i pacchetti persi o duplicati. Qualunque ottimizzazione tu voglia fare, resisti alla tentazione di spezzare la stratificazione tra la tua applicazione e il tuo livello di protocollo.
  • std :: vector , per la maggior parte degli scopi, è identico a un buffer di caratteri allocato dinamicamente non elaborato. Non esitare a usarlo solo perché è uno strato di astrazione. Ci sono due casi in cui dovresti evitarlo, tuttavia:
    • Se riesci a cavartela con buffer allocati staticamente
    • Se è necessario trasferire la proprietà del buffer a valle (sebbene se si progetta attentamente, swap () potrebbe essere sufficiente)
  • La preallocazione è tua amica. Se puoi avere un set di buffer disponibili per l'uso quando arrivano i dati, puoi rimuovere la maggior parte dell'allocazione dinamica dal percorso rapido di esecuzione.
  • Riduci a icona le copie di memoria. Se riesci a elaborare i dati in un singolo stack di chiamate, hai la possibilità di evitare copie. Se devi trasferire i dati a un thread diverso, potresti essere costretto a copiare i dati.
  • Se l'applicazione è in grado di gestire buffer di blocchi (anziché aggregare tutti i dati in un singolo buffer), esaminare writev e readv .

Non credo che nessuna soluzione predefinita risolverà i tuoi problemi. Potenzia ASIO, libevent , ecc. Gestirà tutte le astrazioni dei socket per te, ma ciò che fai con i tuoi dati è comunque sotto la tua responsabilità, una volta che sono stati consegnati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top