特定のパックされた POD 構造体をマルチキャストするアプリケーションと、他のバイナリで実行されるリスナー サービスがあります。リスナー サービスは、構造体がどのように見えるかを認識しているため、それらを受け取ると、それを a で打たれた構造体にキャストし直しreinterpret_cast
、コールバックを実行します。
将来の問題は、バイナリがリリースされ、新しい情報を構造体に追加する必要がある場合、それらのバイナリを再構築する必要があるか、またはバイナリがreinterpret_cast
情報を悪用したり悪用したりすることです。これは、常にそのような柔軟性を持たない実稼働環境では問題になる可能性があります。
私が言われたことの1つは、新しいスタイルのメッセージを導入し、両方を送信することです..そして、時間の経過とともに、アプリケーションは最終的に新しいタイプのバイナリメッセージに切り替えられるまで切り替えます.古いものを送るのはやめましょう。より良い代替手段があるかどうか疑問に思っていました。
たとえば、パックされた構造体の末尾にのみ新しいフィールドを追加するという規則を作成した場合、古いリッスン バイナリは、必要に応じてそれらの新しいフィールドにアクセスできる可能性があり、古い情報で構築されたバイナリは引き続き取得できる可能性があります。上部にアクセスできます。たとえば、送信者がこれをマルチキャストしている場合:
struct foo {
int a;
char b[2];
} __attribute__ ((packed));
次に、いくつかのバイナリが受信側で構築され、ネットワークconst char* msg
上でメッセージを取得してこれを行います。
foo* fooPtr = reinterpret_cast<foo*>(msg);
registeredGuy->callback(fooPtr);
送信者側で追加情報をロールアウトすることを決定した場合、古いリスナーは、次のように下に追加するだけで問題ない場合があります。
struct foo {
int a;
char b[2];
char newStuff[17];
int k;
} __attribute ((packed));
古いレシーバーは以前の情報に正常にキャストしてアクセスできるはずですが、新しい人は新しいものにアクセスできます。これは本当ですか?また、速度に影響を与えないより良いソリューションはありますか (パフォーマンスは非常に重要です)。