Commit e8a25d0f authored by Pavel Vainerman's avatar Pavel Vainerman

(UNetUDP): encoding is not used if the byte order is the same as the system

parent 6dd7a92b
...@@ -18,15 +18,28 @@ ...@@ -18,15 +18,28 @@
#include <endian.h> #include <endian.h>
#include "UDPPacket.h" #include "UDPPacket.h"
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#if INTPTR_MAX == INT64_MAX // сделано так, чтобы макросы раскрывались в "пустоту" если не требуется преобразование
#define LE_TO_H(x) le64toh(x) // поэтому использование выглядит как LE_TO_H( myvar ), а не
#define BE_TO_H(x) be64toh(x) // myvar = LE_TO_H(myvar)
// -------------------------------------------------------------------------
#if __BYTE_ORDER == __LITTLE_ENDIAN
#define LE_TO_H(x) {}
#elif INTPTR_MAX == INT64_MAX
#define LE_TO_H(x) x = le64toh(x)
#elif INTPTR_MAX == INT32_MAX
#define LE_TO_H(x) x = le32toh(x)
#else
#error UNET(LE_TO_H): Unknown byte order or size of pointer
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
#define BE_TO_H(x) {}
#elif INTPTR_MAX == INT64_MAX
#define BE_TO_H(x) x = be64toh(x)
#elif INTPTR_MAX == INT32_MAX #elif INTPTR_MAX == INT32_MAX
#define LE_TO_H(x) le32toh(x) #define BE_TO_H(x) x = be32toh(x)
#define BE_TO_H(x) be32toh(x)
#else #else
#error UNET: Unknown pointer size #error UNET(BE_TO_H): Unknown byte order or size of pointer
#endif #endif
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
namespace uniset namespace uniset
...@@ -309,21 +322,21 @@ namespace uniset ...@@ -309,21 +322,21 @@ namespace uniset
if( be_order ) if( be_order )
{ {
m.magic = BE_TO_H(m.magic); BE_TO_H(m.magic);
m.num = BE_TO_H(m.num); BE_TO_H(m.num);
m.procID = BE_TO_H(m.procID); BE_TO_H(m.procID);
m.nodeID = BE_TO_H(m.nodeID); BE_TO_H(m.nodeID);
m.dcount = BE_TO_H(m.dcount); BE_TO_H(m.dcount);
m.acount = BE_TO_H(m.acount); BE_TO_H(m.acount);
} }
else else
{ {
m.magic = LE_TO_H(m.magic); LE_TO_H(m.magic);
m.num = LE_TO_H(m.num); LE_TO_H(m.num);
m.procID = LE_TO_H(m.procID); LE_TO_H(m.procID);
m.nodeID = LE_TO_H(m.nodeID); LE_TO_H(m.nodeID);
m.dcount = LE_TO_H(m.dcount); LE_TO_H(m.dcount);
m.acount = LE_TO_H(m.acount); LE_TO_H(m.acount);
} }
// set host byte order // set host byte order
...@@ -376,22 +389,26 @@ namespace uniset ...@@ -376,22 +389,26 @@ namespace uniset
{ {
if( be_order ) if( be_order )
{ {
m.a_dat[n].id = BE_TO_H(m.a_dat[n].id); BE_TO_H(m.a_dat[n].id);
m.a_dat[n].val = BE_TO_H(m.a_dat[n].val); BE_TO_H(m.a_dat[n].val);
} }
else else
{ {
m.a_dat[n].id = LE_TO_H(m.a_dat[n].id); LE_TO_H(m.a_dat[n].id);
m.a_dat[n].val = LE_TO_H(m.a_dat[n].val); LE_TO_H(m.a_dat[n].val);
} }
} }
for( size_t n = 0; n < m.dcount; n++ ) for( size_t n = 0; n < m.dcount; n++ )
{ {
if( be_order ) if( be_order )
m.d_id[n] = BE_TO_H(m.d_id[n]); {
BE_TO_H(m.d_id[n]);
}
else else
m.d_id[n] = LE_TO_H(m.d_id[n]); {
LE_TO_H(m.d_id[n]);
}
} }
return i + sz; return i + sz;
......
...@@ -38,6 +38,15 @@ namespace uniset ...@@ -38,6 +38,15 @@ namespace uniset
\warning ТЕКУЩАЯ ВЕРСИЯ ПРОТОКОЛА НЕ БУДЕТ РАБОТАТЬ МЕЖДУ 32-битными и 64-битными системами (из-за отличия в типе long). \warning ТЕКУЩАЯ ВЕРСИЯ ПРОТОКОЛА НЕ БУДЕТ РАБОТАТЬ МЕЖДУ 32-битными и 64-битными системами (из-за отличия в типе long).
т.к. это не сильно актуально, пока не переделываю. т.к. это не сильно актуально, пока не переделываю.
"ByteOrder"
============
В текущей версии протокола. В UDPHeader содержиться информации о порядке байт.
Поэтому логика следующая:
- Узел который посылает, ничего не перекодирует и просто посылает данные так как хранит
(информация о порядке байт, если специально не выставить, будет выставлена при компиляции, см. конструктор)
- Узел который принимает данные, декодирует их, если на его узле порядок байт не совпадает.
Т.е. если все узлы будут иметь одинаковый порядок байт, фактического перекодирования не будет.
*/ */
const uint32_t UNETUDP_MAGICNUM = 0x133EF54; // идентификатор протокола const uint32_t UNETUDP_MAGICNUM = 0x133EF54; // идентификатор протокола
...@@ -75,6 +84,8 @@ namespace uniset ...@@ -75,6 +84,8 @@ namespace uniset
// Теоретический размер данных в UDP пакете (исключая заголовки) 65507 // Теоретический размер данных в UDP пакете (исключая заголовки) 65507
// Фактически желательно не вылезать за размер MTU (обычно 1500) - заголовки = 1432 байта // Фактически желательно не вылезать за размер MTU (обычно 1500) - заголовки = 1432 байта
// т.е. надо чтобы sizeof(UDPPacket) < 1432 // т.е. надо чтобы sizeof(UDPPacket) < 1432
// с другой стороны в текущей реализации
// в сеть посылается фактическое количество данных, а не sizeof(UDPPacket).
// При текущих настройках sizeof(UDPPacket) = 32654 (!) // При текущих настройках sizeof(UDPPacket) = 32654 (!)
static const size_t MaxACount = 1500; static const size_t MaxACount = 1500;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment