UniSet  2.0.0
include/UDPPacket.h
00001 #ifndef UDPPacket_H_
00002 #define UDPPacket_H_
00003 // -----------------------------------------------------------------------------
00004 #include <list>
00005 #include <limits> 
00006 #include <ostream>
00007 #include "UniSetTypes.h"
00008 // -----------------------------------------------------------------------------
00009 namespace UniSetUDP
00010 {
00019     const unsigned int UNETUDP_MAGICNUM = 0xfb07ee55; // идентификатор протокола
00020 
00021     struct UDPHeader
00022     {
00023         UDPHeader():magic(UNETUDP_MAGICNUM),num(0),nodeID(0),procID(0),dcount(0),acount(0){}
00024         unsigned int magic;
00025         unsigned long num;
00026         long nodeID;
00027         long procID;
00028         size_t dcount; 
00029         size_t acount; 
00031         friend std::ostream& operator<<( std::ostream& os, UDPHeader& p );
00032         friend std::ostream& operator<<( std::ostream& os, UDPHeader* p );
00033     }__attribute__((packed));
00034 
00035     static unsigned long MaxPacketNum = std::numeric_limits<unsigned long>::max();
00036 
00037     struct UDPAData
00038     {
00039         UDPAData():id(UniSetTypes::DefaultObjectId),val(0){}
00040         UDPAData(long id, long val):id(id),val(val){}
00041 
00042         long id;
00043         long val;
00044 
00045         friend std::ostream& operator<<( std::ostream& os, UDPAData& p );
00046     }__attribute__((packed));
00047 
00048     // Хотелось бы не вылезать за общий размер посылаемых пакетов 8192. (550,900 --> 8133)
00049 
00050     static const size_t MaxACount = 550;
00051     static const size_t MaxDCount = 900;
00052     static const size_t MaxDDataCount = 1 + MaxDCount / 8*sizeof(unsigned char);
00053 
00054     struct UDPPacket
00055     {
00056         UDPPacket():len(0){}
00057 
00058         int len;
00059         unsigned char data[ sizeof(UDPHeader) + MaxDCount*sizeof(long) + MaxDDataCount + MaxACount*sizeof(UDPAData) ];
00060     }__attribute__((packed));
00061 
00062     static const int MaxDataLen = sizeof(UDPPacket);
00063 
00064     struct UDPMessage:
00065         public UDPHeader
00066     {
00067         UDPMessage();
00068 
00069         UDPMessage( UDPPacket& p );
00070         size_t transport_msg( UDPPacket& p );
00071         static size_t getMessage( UDPMessage& m, UDPPacket& p );
00072 
00073         size_t addDData( long id, bool val );
00074         bool setDData( size_t index, bool val );
00075         long dID( size_t index );
00076         bool dValue( size_t index );
00077 
00078         size_t addAData( const UDPAData& dat );
00079         size_t addAData( long id, long val );
00080         bool setAData( size_t index, long val );
00081 
00082         inline bool isFull(){ return ((dcount<MaxDCount) && (acount<MaxACount)); }
00083         inline int dsize(){ return dcount; }
00084         inline int asize(){ return acount; }
00085 
00086         // количество байт в пакете с булевыми переменными...
00087         int d_byte(){ return dcount*sizeof(long) + dcount; }
00088 
00089         UDPAData a_dat[MaxACount]; 
00090         long d_id[MaxDCount];      
00091         unsigned char d_dat[MaxDDataCount];  
00093         friend std::ostream& operator<<( std::ostream& os, UDPMessage& p );
00094     };
00095 }
00096 // -----------------------------------------------------------------------------
00097 #endif // UDPPacket_H_
00098 // -----------------------------------------------------------------------------