Commit a9671a84 authored by Pavel Vainerman's avatar Pavel Vainerman

(UNetUDP): добавил "волшебное число" в заголовок пакетов, чтобы

отделять свои пакеты от каких-то других..
parent 5881c1e2
...@@ -167,6 +167,13 @@ size_t UDPMessage::getMessage( UDPMessage& m, UDPPacket& p ) ...@@ -167,6 +167,13 @@ size_t UDPMessage::getMessage( UDPMessage& m, UDPPacket& p )
memcpy(&m,&(p.data[i]),sizeof(UDPHeader)); memcpy(&m,&(p.data[i]),sizeof(UDPHeader));
i += sizeof(UDPHeader); i += sizeof(UDPHeader);
// проверяем наш ли пакет..
if( m.magic != UniSetUDP::UNETUDP_MAGICNUM )
{
m.magic = 0;
return 0;
}
// копируем аналоговые данные // копируем аналоговые данные
size_t sz = m.acount*sizeof(UDPAData); size_t sz = m.acount*sizeof(UDPAData);
if( sz > sizeof(m.a_dat) ) if( sz > sizeof(m.a_dat) )
......
...@@ -15,21 +15,25 @@ namespace UniSetUDP ...@@ -15,21 +15,25 @@ namespace UniSetUDP
(по количеству битов такого же размера). (по количеству битов такого же размера).
*/ */
const unsigned int UNETUDP_MAGICNUM = 0xfb07ee55; // идентификатор протокола
struct UDPHeader struct UDPHeader
{ {
UDPHeader():num(0),nodeID(0),procID(0),dcount(0),acount(0){} UDPHeader():magic(UNETUDP_MAGICNUM),num(0),nodeID(0),procID(0),dcount(0),acount(0){}
unsigned int magic;
unsigned long num; unsigned long num;
long nodeID; long nodeID;
long procID; long procID;
size_t dcount; /*!< количество булевых величин */ size_t dcount; /*!< количество булевых величин */
size_t acount; /*!< количество аналоговых величин */ size_t acount; /*!< количество аналоговых величин */
friend std::ostream& operator<<( std::ostream& os, UDPHeader& p ); friend std::ostream& operator<<( std::ostream& os, UDPHeader& p );
friend std::ostream& operator<<( std::ostream& os, UDPHeader* p ); friend std::ostream& operator<<( std::ostream& os, UDPHeader* p );
}__attribute__((packed)); }__attribute__((packed));
static unsigned long MaxPacketNum = std::numeric_limits<unsigned long>::max(); static unsigned long MaxPacketNum = std::numeric_limits<unsigned long>::max();
struct UDPAData struct UDPAData
{ {
UDPAData():id(UniSetTypes::DefaultObjectId),val(0){} UDPAData():id(UniSetTypes::DefaultObjectId),val(0){}
...@@ -37,12 +41,12 @@ namespace UniSetUDP ...@@ -37,12 +41,12 @@ namespace UniSetUDP
long id; long id;
long val; long val;
friend std::ostream& operator<<( std::ostream& os, UDPAData& p ); friend std::ostream& operator<<( std::ostream& os, UDPAData& p );
}__attribute__((packed)); }__attribute__((packed));
// Хотелось бы не вылезать за общий размер посылаемых пакетов 8192. (550,900 --> 8133) // Хотелось бы не вылезать за общий размер посылаемых пакетов 8192. (550,900 --> 8133)
static const size_t MaxACount = 550; static const size_t MaxACount = 550;
static const size_t MaxDCount = 900; static const size_t MaxDCount = 900;
static const size_t MaxDDataCount = 1 + MaxDCount / 8*sizeof(unsigned char); static const size_t MaxDDataCount = 1 + MaxDCount / 8*sizeof(unsigned char);
...@@ -63,14 +67,14 @@ namespace UniSetUDP ...@@ -63,14 +67,14 @@ namespace UniSetUDP
UDPMessage(); UDPMessage();
UDPMessage( UDPPacket& p ); UDPMessage( UDPPacket& p );
size_t transport_msg( UDPPacket& p ); size_t transport_msg( UDPPacket& p );
static size_t getMessage( UDPMessage& m, UDPPacket& p ); static size_t getMessage( UDPMessage& m, UDPPacket& p );
size_t addDData( long id, bool val ); size_t addDData( long id, bool val );
bool setDData( size_t index, bool val ); bool setDData( size_t index, bool val );
long dID( size_t index ); long dID( size_t index );
bool dValue( size_t index ); bool dValue( size_t index );
size_t addAData( const UDPAData& dat ); size_t addAData( const UDPAData& dat );
size_t addAData( long id, long val ); size_t addAData( long id, long val );
bool setAData( size_t index, long val ); bool setAData( size_t index, long val );
...@@ -78,15 +82,14 @@ namespace UniSetUDP ...@@ -78,15 +82,14 @@ namespace UniSetUDP
inline bool isFull(){ return ((dcount<MaxDCount) && (acount<MaxACount)); } inline bool isFull(){ return ((dcount<MaxDCount) && (acount<MaxACount)); }
inline int dsize(){ return dcount; } inline int dsize(){ return dcount; }
inline int asize(){ return acount; } inline int asize(){ return acount; }
// inline int byte_size(){ return (dcount*sizeof(long)*UDPDData) + acount*sizeof(UDPAData)); }
// количество байт в пакете с булевыми переменными... // количество байт в пакете с булевыми переменными...
int d_byte(){ return dcount*sizeof(long) + dcount; } int d_byte(){ return dcount*sizeof(long) + dcount; }
UDPAData a_dat[MaxACount]; /*!< аналоговые величины */ UDPAData a_dat[MaxACount]; /*!< аналоговые величины */
long d_id[MaxDCount]; /*!< список дискретных ID */ long d_id[MaxDCount]; /*!< список дискретных ID */
unsigned char d_dat[MaxDDataCount]; /*!< битовые значения */ unsigned char d_dat[MaxDDataCount]; /*!< битовые значения */
friend std::ostream& operator<<( std::ostream& os, UDPMessage& p ); friend std::ostream& operator<<( std::ostream& os, UDPMessage& p );
}; };
} }
......
...@@ -420,6 +420,12 @@ bool UNetReceiver::recv() ...@@ -420,6 +420,12 @@ bool UNetReceiver::recv()
return false; return false;
} }
if( pack.magic != UniSetUDP::UNETUDP_MAGICNUM )
{
// пакет не нашей "системы"
return false;
}
if( rnum>0 && labs(pack.num - rnum) > maxDifferens ) if( rnum>0 && labs(pack.num - rnum) > maxDifferens )
{ {
/* А что делать если мы уже ждём и ещё не "разгребли предыдущее".. а тут уже повторный "разрыв" /* А что делать если мы уже ждём и ещё не "разгребли предыдущее".. а тут уже повторный "разрыв"
......
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