"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment implémenter des E/S délimitées en C++ pour les tampons de protocole ?

Comment implémenter des E/S délimitées en C++ pour les tampons de protocole ?

Publié le 2024-11-26
Parcourir:951

 How to Implement Delimited I/O in C   for Protocol Buffers?

Fonctions d'E/S délimitées dans les tampons de protocole : équivalents C

Dans les scénarios où plusieurs messages de tampons de protocole sont lus ou écrits à partir de fichiers dans les deux C et Java, il devient nécessaire d'attacher des préfixes de longueur aux messages. Bien que l'API Java fournisse des fonctions d'E/S « délimitées » dédiées à cet effet, leurs équivalents en C peuvent ne pas être facilement apparents.

La récente mise à jour indique que ces équivalents en C résident désormais dans google/protobuf/util /delimited_message_util.h dans le cadre de la version 3.3.0. Cependant, avant cette mise à jour, il existait des implémentations alternatives qui répondaient efficacement à cette exigence.

Une de ces implémentations, fournie par un ancien auteur des bibliothèques protobuf C et Java, inclut des optimisations qui empêchent les échecs potentiels après 64 Mo d'entrée. . Ces implémentations, comme illustré ci-dessous, appliquent la limite de 64 Mo sur les messages individuels, garantissant ainsi que la diffusion se poursuit de manière transparente sans dépasser la limite globale.

Implémentations d'E/S délimitées optimisées pour C

bool writeDelimitedTo(
    const google::protobuf::MessageLite& message,
    google::protobuf::io::ZeroCopyOutputStream* rawOutput) {
  // Initialize a CodedOutputStream for each message.
  google::protobuf::io::CodedOutputStream output(rawOutput);

  // Determine the message size and write it as a Varint.
  int size = message.ByteSize();
  output.WriteVarint32(size);

  // Optimize for messages fitting into a single buffer.
  uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
  if (buffer != NULL) message.SerializeWithCachedSizesToArray(buffer);
  else message.SerializeWithCachedSizes(&output);

  return true;
}

bool readDelimitedFrom(
    google::protobuf::io::ZeroCopyInputStream* rawInput,
    google::protobuf::MessageLite* message) {
  // Initialize a CodedInputStream for each message.
  google::protobuf::io::CodedInputStream input(rawInput);

  // Read the message size.
  uint32_t size;
  if (!input.ReadVarint32(&size)) return false;

  // Restrict reading to the determined message size.
  google::protobuf::io::CodedInputStream::Limit limit =
      input.PushLimit(size);

  // Parse the message and verify it fits within the limit.
  if (!message->MergeFromCodedStream(&input)) return false;
  if (!input.ConsumedEntireMessage()) return false;

  // Lift the reading restriction.
  input.PopLimit(limit);

  return true;
}

Ces implémentations optimisées gèrent efficacement des messages de différentes tailles et fournissent une solution fiable pour les E/S délimitées en C .

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3