Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
U
uniset2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
UniSet project repositories
uniset2
Commits
e8a25d0f
Commit
e8a25d0f
authored
Aug 21, 2018
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(UNetUDP): encoding is not used if the byte order is the same as the system
parent
6dd7a92b
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
52 additions
and
24 deletions
+52
-24
UDPPacket.cc
extensions/UNetUDP/UDPPacket.cc
+41
-24
UDPPacket.h
extensions/UNetUDP/UDPPacket.h
+11
-0
No files found.
extensions/UNetUDP/UDPPacket.cc
View file @
e8a25d0f
...
...
@@ -18,15 +18,28 @@
#include <endian.h>
#include "UDPPacket.h"
// -------------------------------------------------------------------------
#if INTPTR_MAX == INT64_MAX
#define LE_TO_H(x) le64toh(x)
#define BE_TO_H(x) be64toh(x)
// сделано так, чтобы макросы раскрывались в "пустоту" если не требуется преобразование
// поэтому использование выглядит как LE_TO_H( myvar ), а не
// 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
#define LE_TO_H(x) le32toh(x)
#define BE_TO_H(x) be32toh(x)
#define BE_TO_H(x) x = be32toh(x)
#else
#error UNET
: Unknown pointer size
#error UNET
(BE_TO_H): Unknown byte order or size of pointer
#endif
// -------------------------------------------------------------------------
namespace
uniset
...
...
@@ -309,21 +322,21 @@ namespace uniset
if
(
be_order
)
{
m
.
magic
=
BE_TO_H
(
m
.
magic
);
m
.
num
=
BE_TO_H
(
m
.
num
);
m
.
procID
=
BE_TO_H
(
m
.
procID
);
m
.
nodeID
=
BE_TO_H
(
m
.
nodeID
);
m
.
dcount
=
BE_TO_H
(
m
.
dcount
);
m
.
acount
=
BE_TO_H
(
m
.
acount
);
BE_TO_H
(
m
.
magic
);
BE_TO_H
(
m
.
num
);
BE_TO_H
(
m
.
procID
);
BE_TO_H
(
m
.
nodeID
);
BE_TO_H
(
m
.
dcount
);
BE_TO_H
(
m
.
acount
);
}
else
{
m
.
magic
=
LE_TO_H
(
m
.
magic
);
m
.
num
=
LE_TO_H
(
m
.
num
);
m
.
procID
=
LE_TO_H
(
m
.
procID
);
m
.
nodeID
=
LE_TO_H
(
m
.
nodeID
);
m
.
dcount
=
LE_TO_H
(
m
.
dcount
);
m
.
acount
=
LE_TO_H
(
m
.
acount
);
LE_TO_H
(
m
.
magic
);
LE_TO_H
(
m
.
num
);
LE_TO_H
(
m
.
procID
);
LE_TO_H
(
m
.
nodeID
);
LE_TO_H
(
m
.
dcount
);
LE_TO_H
(
m
.
acount
);
}
// set host byte order
...
...
@@ -376,22 +389,26 @@ namespace uniset
{
if
(
be_order
)
{
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
].
id
);
BE_TO_H
(
m
.
a_dat
[
n
].
val
);
}
else
{
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
].
id
);
LE_TO_H
(
m
.
a_dat
[
n
].
val
);
}
}
for
(
size_t
n
=
0
;
n
<
m
.
dcount
;
n
++
)
{
if
(
be_order
)
m
.
d_id
[
n
]
=
BE_TO_H
(
m
.
d_id
[
n
]);
{
BE_TO_H
(
m
.
d_id
[
n
]);
}
else
m
.
d_id
[
n
]
=
LE_TO_H
(
m
.
d_id
[
n
]);
{
LE_TO_H
(
m
.
d_id
[
n
]);
}
}
return
i
+
sz
;
...
...
extensions/UNetUDP/UDPPacket.h
View file @
e8a25d0f
...
...
@@ -38,6 +38,15 @@ namespace uniset
\warning ТЕКУЩАЯ ВЕРСИЯ ПРОТОКОЛА НЕ БУДЕТ РАБОТАТЬ МЕЖДУ 32-битными и 64-битными системами (из-за отличия в типе long).
т.к. это не сильно актуально, пока не переделываю.
"ByteOrder"
============
В текущей версии протокола. В UDPHeader содержиться информации о порядке байт.
Поэтому логика следующая:
- Узел который посылает, ничего не перекодирует и просто посылает данные так как хранит
(информация о порядке байт, если специально не выставить, будет выставлена при компиляции, см. конструктор)
- Узел который принимает данные, декодирует их, если на его узле порядок байт не совпадает.
Т.е. если все узлы будут иметь одинаковый порядок байт, фактического перекодирования не будет.
*/
const
uint32_t
UNETUDP_MAGICNUM
=
0x133EF54
;
// идентификатор протокола
...
...
@@ -75,6 +84,8 @@ namespace uniset
// Теоретический размер данных в UDP пакете (исключая заголовки) 65507
// Фактически желательно не вылезать за размер MTU (обычно 1500) - заголовки = 1432 байта
// т.е. надо чтобы sizeof(UDPPacket) < 1432
// с другой стороны в текущей реализации
// в сеть посылается фактическое количество данных, а не sizeof(UDPPacket).
// При текущих настройках sizeof(UDPPacket) = 32654 (!)
static
const
size_t
MaxACount
=
1500
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment