Fungsi I/O Terhad dalam Penampan Protokol: Setara C
Dalam senario di mana berbilang mesej Penampan Protokol dibaca atau ditulis daripada fail dalam kedua-dua fail C dan Java, ia menjadi perlu untuk melampirkan awalan panjang pada mesej. Walaupun API Java menyediakan fungsi I/O "Terhad" khusus untuk tujuan ini, rakan sejawatannya dalam C mungkin tidak dapat dilihat dengan mudah.
Kemas kini terkini menunjukkan bahawa setara C tersebut kini berada dalam google/protobuf/util /delimited_message_util.h sebagai sebahagian daripada versi 3.3.0. Walau bagaimanapun, sebelum kemas kini ini, terdapat pelaksanaan alternatif yang menangani keperluan ini dengan cekap.
Satu pelaksanaan sedemikian, yang disediakan oleh bekas pengarang perpustakaan protobuf C dan Java, termasuk pengoptimuman yang menghalang kemungkinan kegagalan selepas 64MB input . Pelaksanaan ini, seperti yang digambarkan di bawah, menguatkuasakan had 64MB pada mesej individu, memastikan penstriman diteruskan dengan lancar tanpa melebihi had keseluruhan.
Pelaksanaan I/O Terhad Dioptimumkan untuk C
<code class="cpp">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; }</code>
Pelaksanaan yang dioptimumkan ini mengendalikan mesej dengan pelbagai saiz dengan berkesan dan menyediakan penyelesaian yang boleh dipercayai untuk I/O terhad dalam C .
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan I/O Terhad dalam C untuk Penampan Protokol?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!