|
UniSet
2.0.0
|
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 // -----------------------------------------------------------------------------
1.7.6.1