
Hi Yuval, Yuval Ronen <ronen_yuval@yahoo.com> wrote:
In a 'receiver makes right' protocols, as you describe it, the sender sends the data it in its native endianness. I assume it probably also sends the type of its native endianness, big or little, otherwise the receiver won't be able to know it.
Yes, this information may be transmitted when the connection is first established or in a message header.
Then, the receiver reads the endianness, and then reads all data according to it (which means run-time selection of endianness, hopefully possible using boost::variant).
Yep, although I'm thinking generic code using templates, where the template parameter is based on the endianness.
All of this is great, but I can't see the relevance to the existence of a 'native' option in the endianness enum, sorry. Can you elaborate, please?
It lets me define my message structures once to cater for all types of endianness. E.g. a very simple example: tempalte <endianness E> struct message { endian<E, short, 2> first; endian<E, int, 4> second; endian<E, int, 4> third; ... }; Sender may write: message<native> m; m.first = ... write(sock, buffer(&m, sizeof(m))); Receiver may write: if (peer_is_big_endian) { message<big> m; read(sock, buffer(&m, sizeof(m))); process_message(m); } else { message<little> m; read(sock, buffer(&m, sizeof(m))); process_message(m); } And both sender and receiver may make use of template functions for processing message structures: template <endianness E> void process_message(message<E>& m) { ... } Cheers, Chris