0

私は現在、既存のプロプライエタリなソケット ラッパー コードを修正して、boost asio を使用し、重労働の一部を処理できるようにしています。おそらく、既存のコードの中で最も複雑な領域は、マルチキャスト処理コードです。このコードにより、中間層サーバー (1 つのシステムに多数存在する可能性があります) がクライアント ボックスにマルチキャストを送信できるようになり、クライアント ボックスはこれらを使用してシステムのユーザーに更新を提示します。

コードが複雑でエラーが発生しやすい理由は、多くの未加工のバッファを使用して、マルチキャスト ストリームを元の場所に従って再構成するためです。Boost.Asio でも同じ問題に対処する必要があるようです。そのため、行き詰まる前に、他の人がこの状況にどのように対処したかを聞いてみる価値があると思いました。

非常に一般的なユースケースのようです。私が今持っているようなコードなしでこの仕事をするのに役立つものはありますか? または、この種の作業を実行できる確立された C++ テンプレート (Boost またはその他) はありますか?

明らかに、自分で物事を簡単にし、未加工の配列の代わりに STL コンテナーを使用してパケットをバッファーに入れることができますが、このコードは非常に高性能である必要があります。大規模なインストールでは、膨大な数のパケットが飛び交うため、可能な限りリアルタイムに応答する必要があります。

この件についてご意見をお寄せいただきありがとうございます。

ジェイミー

4

1 に答える 1

2

詳細な回答に十分な情報を提供したようには思えませんが、マルチキャスト データのリアルタイム処理について考慮すべき一般的な指針がいくつかあります。

  • 生の UDP マルチキャストを使用している場合は、パケットの損失または重複に対処するために、ユーザー空間で何らかのプロトコル シーケンスを実行している可能性があります。どのような最適化を行いたいとしても、アプリケーションとプロトコル層の間の階層化を壊したいという誘惑に抵抗してください。
  • std::vectorは、ほとんどの場合、生の動的に割り当てられた文字バッファーと同じです。抽象化レイヤーだからといって、遠慮なく使用してください。ただし、これを避ける必要がある場合が 2 つあります。
    • 静的に割り当てられたバッファを回避できる場合
    • バッファの所有権をダウンストリームに転送する必要がある場合 (慎重に設計すればswap()十分かもしれません)
  • 事前割り当てはあなたの友達です。データが入ってきたときに使用できる一連のバッファーを用意できる場合は、ほとんどの動的割り当てを実行の高速パスから削除できます。
  • メモリのコピーを最小限に抑えます。単一のコール スタックでデータを処理できる場合は、コピーを回避できる可能性があります。別のスレッドにデータを渡す必要がある場合は、データのコピーを余儀なくされることがあります。
  • アプリケーションが (すべてのデータを 1 つのバッファーに集約するのではなく) チャンク バッファーを処理できる場合は、 と を調べてwritevくださいreadv

定型的な解決策があなたの問題を解決するとは思いません。Boost ASIOlibeventなどはすべてソケットの抽象化を処理しますが、データが配信された後は、データをどう処理するかは引き続きユーザーの責任です。

于 2008-12-07T01:48:48.237 に答える