UniSet  2.8.0
UDPPacket.h
1 /*
2  * Copyright (c) 2015 Pavel Vainerman.
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as
6  * published by the Free Software Foundation, version 2.1.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  * Lesser General Lesser Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  */
16 // -----------------------------------------------------------------------------
17 #ifndef UDPPacket_H_
18 #define UDPPacket_H_
19 // -----------------------------------------------------------------------------
20 #include <list>
21 #include <limits>
22 #include <ostream>
23 #include "UniSetTypes.h"
24 // --------------------------------------------------------------------------
25 namespace uniset
26 {
27  // -----------------------------------------------------------------------------
28  namespace UniSetUDP
29  {
52  const uint32_t UNETUDP_MAGICNUM = 0x133EF54; // идентификатор протокола
53 
54  struct UDPHeader
55  {
56  UDPHeader() noexcept;
57  uint32_t magic;
58  u_char _be_order; // 1 - BE byte order, 0 - LE byte order
59  size_t num;
60  long nodeID;
61  long procID;
62 
63  size_t dcount;
64  size_t acount;
66  } __attribute__((packed));
67 
68  std::ostream& operator<<( std::ostream& os, UDPHeader& p );
69  std::ostream& operator<<( std::ostream& os, UDPHeader* p );
70 
71  const size_t MaxPacketNum = std::numeric_limits<size_t>::max();
72 
73  struct UDPAData
74  {
75  UDPAData() noexcept: id(uniset::DefaultObjectId), val(0) {}
76  UDPAData(long id, long val) noexcept: id(id), val(val) {}
77 
78  long id;
79  long val;
80 
81  } __attribute__((packed));
82 
83  std::ostream& operator<<( std::ostream& os, UDPAData& p );
84 
85  // Теоретический размер данных в UDP пакете (исключая заголовки) 65507
86  // Фактически желательно не вылезать за размер MTU (обычно 1500) - заголовки = 1432 байта
87  // т.е. надо чтобы sizeof(UDPPacket) < 1432
88  // с другой стороны в текущей реализации
89  // в сеть посылается фактическое количество данных, а не sizeof(UDPPacket).
90 
91  // При текущих настройках sizeof(UDPPacket) = 72679 (!)
92  static const size_t MaxACount = 2000;
93  static const size_t MaxDCount = 5000;
94  static const size_t MaxDDataCount = 1 + MaxDCount / 8 * sizeof(unsigned char);
95 
96  struct UDPPacket
97  {
98  UDPPacket() noexcept: len(0) {} // -V730
99 
100  size_t len;
101  uint8_t data[ sizeof(UDPHeader) + MaxDCount * sizeof(long) + MaxDDataCount + MaxACount * sizeof(UDPAData) ];
102  } __attribute__((packed));
103 
104  static const size_t MaxDataLen = sizeof(UDPPacket);
105 
106  struct UDPMessage:
107  public UDPHeader
108  {
109  UDPMessage() noexcept;
110 
111  UDPMessage(UDPMessage&& m) noexcept = default;
112  UDPMessage& operator=(UDPMessage&&) noexcept = default;
113 
114  UDPMessage( const UDPMessage& m ) noexcept = default;
115  UDPMessage& operator=(const UDPMessage&) noexcept = default;
116 
117  explicit UDPMessage( UDPPacket& p ) noexcept;
118  size_t transport_msg( UDPPacket& p ) const noexcept;
119 
120  static size_t getMessage( UDPMessage& m, UDPPacket& p ) noexcept;
121 
122  // \warning в случае переполнения возвращается MaxDCount
123  size_t addDData( long id, bool val ) noexcept;
124 
126  bool setDData( size_t index, bool val ) noexcept;
127 
129  long dID( size_t index ) const noexcept;
130 
132  bool dValue( size_t index ) const noexcept;
133 
134  // функции addAData возвращают индекс, по которому потом можно напрямую писать при помощи setAData(index)
135  // \warning в случае переполнения возвращается MaxACount
136  size_t addAData( const UDPAData& dat ) noexcept;
137  size_t addAData( long id, long val ) noexcept;
138 
140  bool setAData( size_t index, long val ) noexcept;
141 
142  long getDataID( ) const noexcept;
144  inline bool isAFull() const noexcept
145  {
146  return (acount >= MaxACount);
147  }
148  inline bool isDFull() const noexcept
149  {
150  return (dcount >= MaxDCount);
151  }
152 
153  inline bool isFull() const noexcept
154  {
155  return !((dcount < MaxDCount) && (acount < MaxACount));
156  }
157 
158  inline size_t dsize() const noexcept
159  {
160  return dcount;
161  }
162 
163  inline size_t asize() const noexcept
164  {
165  return acount;
166  }
167 
168  // размер итогового пакета в байтах
169  size_t sizeOf() const noexcept;
170 
171  uint16_t getDataCRC() const noexcept;
172 
173  // количество байт в пакете с булевыми переменными...
174  size_t d_byte() const noexcept
175  {
176  return dcount * sizeof(long) + dcount;
177  }
178 
179  UDPAData a_dat[MaxACount];
180  long d_id[MaxDCount];
181  uint8_t d_dat[MaxDDataCount];
182  };
183 
184  std::ostream& operator<<( std::ostream& os, UDPMessage& p );
185 
186  uint16_t makeCRC( unsigned char* buf, size_t len ) noexcept;
187  }
188  // --------------------------------------------------------------------------
189 } // end of namespace uniset
190 // -----------------------------------------------------------------------------
191 #endif // UDPPacket_H_
192 // -----------------------------------------------------------------------------
Definition: CommonEventLoop.h:14
UDPAData a_dat[MaxACount]
Definition: UDPPacket.h:179
bool setAData(size_t index, long val) noexcept
Definition: UDPPacket.cc:185
bool setDData(size_t index, bool val) noexcept
Definition: UDPPacket.cc:215
Definition: UDPPacket.h:73
uint8_t d_dat[MaxDDataCount]
Definition: UDPPacket.h:181
const ObjectId DefaultObjectId
Definition: UniSetTypes.h:69
long dID(size_t index) const noexcept
Definition: UDPPacket.cc:235
Definition: UDPPacket.h:106
Definition: UDPPacket.h:96
long d_id[MaxDCount]
Definition: UDPPacket.h:180
size_t dcount
Definition: UDPPacket.h:63
long getDataID() const noexcept
Definition: UDPPacket.cc:283
size_t acount
Definition: UDPPacket.h:64
Definition: UDPPacket.h:54
bool dValue(size_t index) const noexcept
Definition: UDPPacket.cc:243