Commit b4672e62 authored by Pavel Vainerman's avatar Pavel Vainerman

[unet]: zero copy optimization

parent bff519c6
...@@ -35,7 +35,7 @@ static bool HostIsBigEndian = false; ...@@ -35,7 +35,7 @@ static bool HostIsBigEndian = false;
#if __BYTE_ORDER == __BIG_ENDIAN #if __BYTE_ORDER == __BIG_ENDIAN
static bool HostIsBigEndian = true; static bool HostIsBigEndian = true;
#define BE_TO_H(x) {} header.#define BE_TO_H(x) {}
#elif INTPTR_MAX == INT64_MAX #elif INTPTR_MAX == INT64_MAX
#define BE_TO_H(x) x = be64toh(x) #define BE_TO_H(x) x = be64toh(x)
#elif INTPTR_MAX == INT32_MAX #elif INTPTR_MAX == INT32_MAX
...@@ -141,7 +141,6 @@ namespace uniset ...@@ -141,7 +141,6 @@ namespace uniset
return os << (*p); return os << (*p);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
std::ostream& UniSetUDP::operator<<( std::ostream& os, UniSetUDP::UDPAData& p ) std::ostream& UniSetUDP::operator<<( std::ostream& os, UniSetUDP::UDPAData& p )
{ {
return os << "id=" << p.id << " val=" << p.val; return os << "id=" << p.id << " val=" << p.val;
...@@ -153,29 +152,25 @@ namespace uniset ...@@ -153,29 +152,25 @@ namespace uniset
os << "DIGITAL:" << endl; os << "DIGITAL:" << endl;
for( size_t i = 0; i < p.dcount; i++ ) for( size_t i = 0; i < p.header.dcount; i++ )
os << "[" << i << "]={" << p.dID(i) << "," << p.dValue(i) << "}" << endl; os << "[" << i << "]={" << p.dID(i) << "," << p.dValue(i) << "}" << endl;
os << "ANALOG:" << endl; os << "ANALOG:" << endl;
for( size_t i = 0; i < p.acount; i++ ) for( size_t i = 0; i < p.header.acount; i++ )
os << "[" << i << "]={" << p.a_dat[i].id << "," << p.a_dat[i].val << "}" << endl; os << "[" << i << "]={" << p.a_dat[i].id << "," << p.a_dat[i].val << "}" << endl;
return os; return os;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
UDPMessage::UDPMessage() noexcept
{
}
// -----------------------------------------------------------------------------
size_t UDPMessage::addAData( const UniSetUDP::UDPAData& dat ) noexcept size_t UDPMessage::addAData( const UniSetUDP::UDPAData& dat ) noexcept
{ {
if( acount >= MaxACount ) if( header.acount >= MaxACount )
return MaxACount; return MaxACount;
a_dat[acount] = dat; a_dat[header.acount] = dat;
acount++; header.acount++;
return acount - 1; return header.acount - 1;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
size_t UDPMessage::addAData( long id, long val) noexcept size_t UDPMessage::addAData( long id, long val) noexcept
...@@ -197,18 +192,18 @@ namespace uniset ...@@ -197,18 +192,18 @@ namespace uniset
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
size_t UDPMessage::addDData( long id, bool val ) noexcept size_t UDPMessage::addDData( long id, bool val ) noexcept
{ {
if( dcount >= MaxDCount ) if( header.dcount >= MaxDCount )
return MaxDCount; return MaxDCount;
// сохраняем ID // сохраняем ID
d_id[dcount] = id; d_id[header.dcount] = id;
bool res = setDData( dcount, val ); bool res = setDData( header.dcount, val );
if( res ) if( res )
{ {
dcount++; header.dcount++;
return dcount - 1; return header.dcount - 1;
} }
return MaxDCount; return MaxDCount;
...@@ -219,8 +214,8 @@ namespace uniset ...@@ -219,8 +214,8 @@ namespace uniset
if( index >= MaxDCount ) if( index >= MaxDCount )
return false; return false;
size_t nbyte = index / 8 * sizeof(unsigned char); size_t nbyte = index / 8 * sizeof(uint8_t);
size_t nbit = index % 8 * sizeof(unsigned char); size_t nbit = index % 8 * sizeof(uint8_t);
// выставляем бит // выставляем бит
unsigned char d = d_dat[nbyte]; unsigned char d = d_dat[nbyte];
...@@ -247,176 +242,106 @@ namespace uniset ...@@ -247,176 +242,106 @@ namespace uniset
if( index >= MaxDCount ) if( index >= MaxDCount )
return uniset::DefaultObjectId; return uniset::DefaultObjectId;
size_t nbyte = index / 8 * sizeof(unsigned char); size_t nbyte = index / 8 * sizeof(uint8_t);
size_t nbit = index % 8 * sizeof(unsigned char); size_t nbit = index % 8 * sizeof(uint8_t);
return ( d_dat[nbyte] & (1 << nbit) ); return ( d_dat[nbyte] & (1 << nbit) );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
size_t UDPMessage::transport_msg( UDPPacket& p ) const noexcept
{
p = UDPPacket{}; // reset data
size_t i = 0;
memcpy(&(p.data[i]), this, sizeof(UDPHeader));
i += sizeof(UDPHeader);
// копируем аналоговые данные
size_t sz = acount * sizeof(UDPAData);
memcpy(&(p.data[i]), a_dat, sz);
i += sz;
// копируем булевые индексы
sz = dcount * sizeof(long);
memcpy(&(p.data[i]), d_id, sz);
i += sz;
// копируем булевые данные
size_t nbyte = dcount / 8 * sizeof(unsigned char);
size_t nbit = dcount % 8 * sizeof(unsigned char);
sz = nbit > 0 ? nbyte + 1 : nbyte;
memcpy(&(p.data[i]), d_dat, sz);
i += sz;
p.len = i;
return i;
}
// -----------------------------------------------------------------------------
long UDPMessage::getDataID() const noexcept long UDPMessage::getDataID() const noexcept
{ {
// в качестве идентификатора берётся ID первого датчика в данных // в качестве идентификатора берётся ID первого датчика в данных
// приоритет имеет аналоговые датчики // приоритет имеет аналоговые датчики
if( acount > 0 ) if( header.acount > 0 )
return a_dat[0].id; return a_dat[0].id;
if( dcount > 0 ) if( header.dcount > 0 )
return d_id[0]; return d_id[0];
// если нет данных(?) просто возвращаем номер пакета // если нет данных(?) просто возвращаем номер пакета
return num; return header.num;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
size_t UniSetUDP::UDPMessage::sizeOf() const noexcept size_t UniSetUDP::UDPMessage::len() const noexcept
{ {
return UniSetUDP::MaxDataLen;
// биты которые не уместились в очередной байт, добавляют ещё один байт // биты которые не уместились в очередной байт, добавляют ещё один байт
size_t nbit = dcount % 8 * sizeof(unsigned char); // size_t nbit = header.dcount % 8 * sizeof(uint8_t);
size_t add = nbit > 0 ? 1 : 0; // size_t add = nbit > 0 ? 1 : 0;
return sizeof(UDPHeader) + acount * sizeof(UDPAData) + dcount * sizeof(long) + (dcount / 8 * sizeof(unsigned char) + add); // return sizeof(header) + header.acount * sizeof(UDPAData) + header.dcount * sizeof(long) + (header.dcount / 8 * sizeof(uint8_t) + add);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
UDPMessage::UDPMessage( UDPPacket& p ) noexcept bool UDPMessage::isOk() noexcept
{ {
getMessage(*this, p); return ( header.magic != UniSetUDP::UNETUDP_MAGICNUM );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
size_t UDPMessage::getMessage( UDPMessage& m, UDPPacket& p ) noexcept void UDPMessage::ntoh() noexcept
{ {
// reset data
m = UDPMessage{};
size_t i = 0;
memcpy(&m, &(p.data[i]), sizeof(UDPHeader));
i += sizeof(UDPHeader);
// byte order from packet // byte order from packet
u_char be_order = m._be_order; uint8_t be_order = header._be_order;
if( be_order && !HostIsBigEndian ) if( be_order && !HostIsBigEndian )
{ {
BE_TO_H(m.magic); BE_TO_H(header.magic);
BE_TO_H(m.num); BE_TO_H(header.num);
BE_TO_H(m.procID); BE_TO_H(header.procID);
BE_TO_H(m.nodeID); BE_TO_H(header.nodeID);
BE_TO_H(m.dcount); BE_TO_H(header.dcount);
BE_TO_H(m.acount); BE_TO_H(header.acount);
} }
else if( !be_order && HostIsBigEndian ) else if( !be_order && HostIsBigEndian )
{ {
LE_TO_H(m.magic); LE_TO_H(header.magic);
LE_TO_H(m.num); LE_TO_H(header.num);
LE_TO_H(m.procID); LE_TO_H(header.procID);
LE_TO_H(m.nodeID); LE_TO_H(header.nodeID);
LE_TO_H(m.dcount); LE_TO_H(header.dcount);
LE_TO_H(m.acount); LE_TO_H(header.acount);
} }
// set host byte order // set host byte order
#if __BYTE_ORDER == __LITTLE_ENDIAN #if __BYTE_ORDER == __LITTLE_ENDIAN
m._be_order = 0; header._be_order = 0;
#elif __BYTE_ORDER == __BIG_ENDIAN #elif __BYTE_ORDER == __BIG_ENDIAN
m. be_order = 1; header._be_order = 1;
#else #else
#error UNET(getMessage): Unknown byte order! #error UNET(getMessage): Unknown byte order!
#endif #endif
// проверяем наш ли пакет..
if( m.magic != UniSetUDP::UNETUDP_MAGICNUM )
{
m.magic = 0;
return 0;
}
// копируем аналоговые данные
size_t sz = m.acount * sizeof(UDPAData);
if( sz > sizeof(m.a_dat) )
sz = sizeof(m.a_dat);
memcpy(m.a_dat, &(p.data[i]), sz);
i += sz;
// копируем булевые индексы
sz = m.dcount * sizeof(long);
if( sz > sizeof(m.d_id) )
sz = sizeof(m.d_id);
memcpy(m.d_id, &(p.data[i]), sz);
i += sz;
// копируем булевые данные
size_t nbyte = m.dcount / 8 * sizeof(unsigned char);
size_t nbit = m.dcount % 8 * sizeof(unsigned char);
sz = nbit > 0 ? nbyte + 1 : nbyte;
if( sz > sizeof(m.d_dat) )
sz = sizeof(m.d_dat);
memcpy(m.d_dat, &(p.data[i]), sz);
// CONVERT DATA TO HOST BYTE ORDER // CONVERT DATA TO HOST BYTE ORDER
// ------------------------------- // -------------------------------
if( (be_order && !HostIsBigEndian) || (!be_order && HostIsBigEndian) ) if( (be_order && !HostIsBigEndian) || (!be_order && HostIsBigEndian) )
{ {
for( size_t n = 0; n < m.acount; n++ ) for( size_t n = 0; n < header.acount; n++ )
{ {
if( be_order ) if( be_order )
{ {
BE_TO_H(m.a_dat[n].id); BE_TO_H(a_dat[n].id);
BE_TO_H(m.a_dat[n].val); BE_TO_H(a_dat[n].val);
} }
else else
{ {
LE_TO_H(m.a_dat[n].id); LE_TO_H(a_dat[n].id);
LE_TO_H(m.a_dat[n].val); LE_TO_H(a_dat[n].val);
} }
} }
for( size_t n = 0; n < m.dcount; n++ ) for( size_t n = 0; n < header.dcount; n++ )
{ {
if( be_order ) if( be_order )
{ {
BE_TO_H(m.d_id[n]); BE_TO_H(d_id[n]);
} }
else else
{ {
LE_TO_H(m.d_id[n]); LE_TO_H(d_id[n]);
} }
} }
} }
return i + sz;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
uint16_t UDPMessage::getDataCRC() const noexcept uint16_t UDPMessage::getDataCRC() const noexcept
......
...@@ -24,17 +24,17 @@ ...@@ -24,17 +24,17 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
namespace uniset namespace uniset
{ {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
namespace UniSetUDP namespace UniSetUDP
{ {
/*! Для оптимизации размера передаваемых данных, но с учётом того, что ID могут идти не подряд. /*! Для оптимизации размера передаваемых данных, но с учётом того, что ID могут идти не подряд.
Сделан следующий формат: Сделан следующий формат:
Для аналоговых величин передаётся массив пар "id-value"(UDPAData). Для аналоговых величин передаётся массив пар "id-value"(UDPAData).
Для булевых величин - отдельно массив ID и отдельно битовый массив со значениями, Для булевых величин - отдельно массив ID и отдельно битовый массив со значениями,
(по количеству битов такого же размера). (по количеству битов такого же размера).
\todo Подумать на тему сделать два отдельных вида пакетов для булевых значений и для аналоговых, \todo Подумать на тему сделать два отдельных вида пакетов для булевых значений и для аналоговых,
чтобы уйти от преобразования UDPMessage --> UDPPacket --> UDPMessage. чтобы уйти от преобразования UDPMessage --> UDPPacket --> UDPMessage.
\warning ТЕКУЩАЯ ВЕРСИЯ ПРОТОКОЛА НЕ БУДЕТ РАБОТАТЬ МЕЖДУ 32-битными и 64-битными системами (из-за отличия в типе long). \warning ТЕКУЩАЯ ВЕРСИЯ ПРОТОКОЛА НЕ БУДЕТ РАБОТАТЬ МЕЖДУ 32-битными и 64-битными системами (из-за отличия в типе long).
т.к. это не сильно актуально, пока не переделываю. т.к. это не сильно актуально, пока не переделываю.
...@@ -49,21 +49,19 @@ namespace uniset ...@@ -49,21 +49,19 @@ namespace uniset
Т.е. если все узлы будут иметь одинаковый порядок байт, фактического перекодирования не будет. Т.е. если все узлы будут иметь одинаковый порядок байт, фактического перекодирования не будет.
*/ */
const uint32_t UNETUDP_MAGICNUM = 0x133EF54; // идентификатор протокола const uint32_t UNETUDP_MAGICNUM = 0x1343EFD; // идентификатор протокола
struct UDPHeader struct UDPHeader
{ {
UDPHeader() noexcept; UDPHeader() noexcept;
uint32_t magic; uint32_t magic;
u_char _be_order; // 1 - BE byte order, 0 - LE byte order uint8_t _be_order; // 1 - BE byte order, 0 - LE byte order
size_t num; size_t num;
long nodeID; long nodeID;
long procID; long procID;
size_t dcount; /*!< количество булевых величин */
size_t dcount; /*!< количество булевых величин */ size_t acount; /*!< количество аналоговых величин */
size_t acount; /*!< количество аналоговых величин */ } __attribute__((packed));
} __attribute__((packed));
std::ostream& operator<<( std::ostream& os, UDPHeader& p ); std::ostream& operator<<( std::ostream& os, UDPHeader& p );
std::ostream& operator<<( std::ostream& os, UDPHeader* p ); std::ostream& operator<<( std::ostream& os, UDPHeader* p );
...@@ -87,37 +85,16 @@ namespace uniset ...@@ -87,37 +85,16 @@ namespace uniset
// т.е. надо чтобы sizeof(UDPPacket) < 1432 // т.е. надо чтобы sizeof(UDPPacket) < 1432
// с другой стороны в текущей реализации // с другой стороны в текущей реализации
// в сеть посылается фактическое количество данных, а не sizeof(UDPPacket). // в сеть посылается фактическое количество данных, а не sizeof(UDPPacket).
// При текущих настройках sizeof(UDPPacket) = 72679 (!)
static const size_t MaxACount = 1000;
static const size_t MaxDCount = 3000;
static const size_t MaxDDataCount = 1 + MaxDCount / 8 * sizeof(unsigned char);
// При текущих настройках sizeof(UDPPacket) = 72679 (!) struct UDPMessage
static const size_t MaxACount = 2000; {
static const size_t MaxDCount = 5000; // net to host
static const size_t MaxDDataCount = 1 + MaxDCount / 8 * sizeof(unsigned char); void ntoh() noexcept;
bool isOk() noexcept;
struct UDPPacket
{
UDPPacket() noexcept: len(0) {} // -V730
size_t len;
uint8_t data[ sizeof(UDPHeader) + MaxDCount * sizeof(long) + MaxDDataCount + MaxACount * sizeof(UDPAData) ];
} __attribute__((packed));
static const size_t MaxDataLen = sizeof(UDPPacket);
struct UDPMessage:
public UDPHeader
{
UDPMessage() noexcept;
UDPMessage(UDPMessage&& m) noexcept = default;
UDPMessage& operator=(UDPMessage&&) noexcept = default;
UDPMessage( const UDPMessage& m ) noexcept = default;
UDPMessage& operator=(const UDPMessage&) noexcept = default;
explicit UDPMessage( UDPPacket& p ) noexcept;
size_t transport_msg( UDPPacket& p ) const noexcept;
static size_t getMessage( UDPMessage& m, UDPPacket& p ) noexcept;
// \warning в случае переполнения возвращается MaxDCount // \warning в случае переполнения возвращается MaxDCount
size_t addDData( long id, bool val ) noexcept; size_t addDData( long id, bool val ) noexcept;
...@@ -141,51 +118,61 @@ namespace uniset ...@@ -141,51 +118,61 @@ namespace uniset
long getDataID( ) const noexcept; /*!< получение "уникального" идентификатора данных этого пакета */ long getDataID( ) const noexcept; /*!< получение "уникального" идентификатора данных этого пакета */
inline bool isAFull() const noexcept inline bool isAFull() const noexcept
{ {
return (acount >= MaxACount); return (header.acount >= MaxACount);
} }
inline bool isDFull() const noexcept inline bool isDFull() const noexcept
{ {
return (dcount >= MaxDCount); return (header.dcount >= MaxDCount);
} }
inline bool isFull() const noexcept inline bool isFull() const noexcept
{ {
return !((dcount < MaxDCount) && (acount < MaxACount)); return !((header.dcount < MaxDCount) && (header.acount < MaxACount));
} }
inline size_t dsize() const noexcept inline size_t dsize() const noexcept
{ {
return dcount; return header.dcount;
} }
inline size_t asize() const noexcept inline size_t asize() const noexcept
{ {
return acount; return header.acount;
} }
// размер итогового пакета в байтах // размер итогового пакета в байтах
size_t sizeOf() const noexcept; size_t len() const noexcept;
uint16_t getDataCRC() const noexcept; uint16_t getDataCRC() const noexcept;
// количество байт в пакете с булевыми переменными... // количество байт в пакете с булевыми переменными...
size_t d_byte() const noexcept size_t d_byte() const noexcept
{ {
return dcount * sizeof(long) + dcount; return header.dcount * sizeof(long) + header.dcount;
} }
UDPAData a_dat[MaxACount]; /*!< аналоговые величины */ UDPHeader header;
long d_id[MaxDCount]; /*!< список дискретных ID */ UDPAData a_dat[MaxACount]; /*!< аналоговые величины */
uint8_t d_dat[MaxDDataCount]; /*!< битовые значения */ long d_id[MaxDCount]; /*!< список дискретных ID */
}; uint8_t d_dat[MaxDDataCount]; /*!< битовые значения */
} __attribute__((packed));
std::ostream& operator<<( std::ostream& os, UDPMessage& p ); std::ostream& operator<<( std::ostream& os, UDPMessage& p );
uint16_t makeCRC( unsigned char* buf, size_t len ) noexcept; uint16_t makeCRC( unsigned char* buf, size_t len ) noexcept;
}
// -------------------------------------------------------------------------- static const size_t MaxDataLen = sizeof(UDPHeader) + MaxDCount * sizeof(long) + MaxDDataCount + MaxACount * sizeof(UDPAData);
union UDPPacket
{
UDPPacket():msg(){};
uint8_t raw[MaxDataLen];
UDPMessage msg;
};
}
// --------------------------------------------------------------------------
} // end of namespace uniset } // end of namespace uniset
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#endif // UDPPacket_H_ #endif // UDPPacket_H_
......
...@@ -29,26 +29,16 @@ using namespace uniset; ...@@ -29,26 +29,16 @@ using namespace uniset;
using namespace uniset::extensions; using namespace uniset::extensions;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
CommonEventLoop UNetReceiver::loop; CommonEventLoop UNetReceiver::loop;
static UniSetUDP::UDPPacket defpack;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
UNetReceiver::UNetReceiver(const std::string& s_host, int _port UNetReceiver::UNetReceiver(const std::string& s_host, int _port
, const std::shared_ptr<SMInterface>& smi , const std::shared_ptr<SMInterface>& smi
, bool nocheckConnection , bool nocheckConnection
, const std::string& prefix ): , const std::string& prefix ):
shm(smi), shm(smi),
updatepause(100),
port(_port), port(_port),
saddr(s_host, _port), saddr(s_host, _port),
recvTimeout(5000), cbuf(cbufSize)
prepareTime(2000),
lostTimeout(200), /* 2*updatepause */
lostPackets(0),
sidRespond(uniset::DefaultObjectId),
respondInvert(false),
sidLostPackets(uniset::DefaultObjectId),
activated(false),
cbuf(cbufSize),
maxDifferens(20),
lockUpdate(false)
{ {
{ {
ostringstream s; ostringstream s;
...@@ -345,9 +335,9 @@ size_t UNetReceiver::rnext( size_t num ) ...@@ -345,9 +335,9 @@ size_t UNetReceiver::rnext( size_t num )
while( i < wnum ) while( i < wnum )
{ {
p = &cbuf[i % cbufSize]; p = &cbuf[i % cbufSize].msg;
if( p->num > num ) if( p->header.num > num )
return i; return i;
i++; i++;
...@@ -371,21 +361,23 @@ void UNetReceiver::update() noexcept ...@@ -371,21 +361,23 @@ void UNetReceiver::update() noexcept
// либо обнаружится "дырка" в последовательности, // либо обнаружится "дырка" в последовательности,
while( rnum < wnum ) while( rnum < wnum )
{ {
p = &cbuf[rnum % cbufSize]; p = &(cbuf[rnum % cbufSize].msg);
// cout << "update: num=" << p->header.num << " rnum=" << rnum << " wnum=" << wnum << endl;
// если номер пакета не равен ожидаемому, ждём считая что это "дырка" // если номер пакета не равен ожидаемому, ждём считая что это "дырка"
// т.к. разрывы и другие случаи обрабатываются при приёме пакетов // т.к. разрывы и другие случаи обрабатываются при приёме пакетов
if( p->num != rnum ) if( p->header.num != rnum )
{ {
if( !ptLostTimeout.checkTime() ) if( !ptLostTimeout.checkTime() )
return; return;
size_t sub = 1; size_t sub = 1;
if( p->num > rnum ) if( p->header.num > rnum )
sub = (p->num - rnum); sub = (p->header.num - rnum);
unetwarn << myname << "(update): lostTimeout(" << ptLostTimeout.getInterval() << ")! pnum=" << p->num << " lost " << sub << " packets " << endl; unetwarn << myname << "(update): lostTimeout(" << ptLostTimeout.getInterval() << ")! pnum=" << p->header.num << " lost " << sub << " packets " << endl;
lostPackets += sub; lostPackets += sub;
// ищем следующий пакет для обработки // ищем следующий пакет для обработки
...@@ -400,7 +392,7 @@ void UNetReceiver::update() noexcept ...@@ -400,7 +392,7 @@ void UNetReceiver::update() noexcept
// Обработка дискретных // Обработка дискретных
auto d_iv = getDCache(p); auto d_iv = getDCache(p);
for( size_t i = 0; i < p->dcount; i++ ) for( size_t i = 0; i < p->header.dcount; i++ )
{ {
try try
{ {
...@@ -422,7 +414,7 @@ void UNetReceiver::update() noexcept ...@@ -422,7 +414,7 @@ void UNetReceiver::update() noexcept
} }
catch( const uniset::Exception& ex) catch( const uniset::Exception& ex)
{ {
unetcrit << myname << "(update): " unetcrit << myname << "(update): D:"
<< " id=" << s_id << " id=" << s_id
<< " val=" << p->dValue(i) << " val=" << p->dValue(i)
<< " error: " << ex << " error: " << ex
...@@ -430,7 +422,7 @@ void UNetReceiver::update() noexcept ...@@ -430,7 +422,7 @@ void UNetReceiver::update() noexcept
} }
catch(...) catch(...)
{ {
unetcrit << myname << "(update): " unetcrit << myname << "(update): D:"
<< " id=" << s_id << " id=" << s_id
<< " val=" << p->dValue(i) << " val=" << p->dValue(i)
<< " error: catch..." << " error: catch..."
...@@ -441,7 +433,7 @@ void UNetReceiver::update() noexcept ...@@ -441,7 +433,7 @@ void UNetReceiver::update() noexcept
// Обработка аналоговых // Обработка аналоговых
auto a_iv = getACache(p); auto a_iv = getACache(p);
for( size_t i = 0; i < p->acount; i++ ) for( size_t i = 0; i < p->header.acount; i++ )
{ {
try try
{ {
...@@ -463,7 +455,7 @@ void UNetReceiver::update() noexcept ...@@ -463,7 +455,7 @@ void UNetReceiver::update() noexcept
} }
catch( const uniset::Exception& ex) catch( const uniset::Exception& ex)
{ {
unetcrit << myname << "(update): " unetcrit << myname << "(update): A:"
<< " id=" << dat->id << " id=" << dat->id
<< " val=" << dat->val << " val=" << dat->val
<< " error: " << ex << " error: " << ex
...@@ -471,7 +463,7 @@ void UNetReceiver::update() noexcept ...@@ -471,7 +463,7 @@ void UNetReceiver::update() noexcept
} }
catch(...) catch(...)
{ {
unetcrit << myname << "(update): " unetcrit << myname << "(update): A:"
<< " id=" << dat->id << " id=" << dat->id
<< " val=" << dat->val << " val=" << dat->val
<< " error: catch..." << " error: catch..."
...@@ -628,8 +620,9 @@ bool UNetReceiver::receive() noexcept ...@@ -628,8 +620,9 @@ bool UNetReceiver::receive() noexcept
{ {
try try
{ {
ssize_t ret = udp->receiveBytes(r_buf.data, sizeof(r_buf.data)); // сперва пробуем сохранить пакет в том месте, где должен быть очередной пакет
recvCount++; pack = &(cbuf[wnum % cbufSize]);
ssize_t ret = udp->receiveBytes(pack->raw, sizeof(pack->raw) /* UniSetUDP::MaxDataLen */);
if( ret < 0 ) if( ret < 0 )
{ {
...@@ -639,27 +632,24 @@ bool UNetReceiver::receive() noexcept ...@@ -639,27 +632,24 @@ bool UNetReceiver::receive() noexcept
if( ret == 0 ) if( ret == 0 )
{ {
unetwarn << myname << "(receive): disconnected?!... recv 0 byte.." << endl; unetwarn << myname << "(receive): disconnected?!... recv 0 bytes.." << endl;
return false; return false;
} }
// сперва пробуем сохранить пакет в том месте, где должен быть очередной пакет recvCount++;
pack = &cbuf[wnum % cbufSize];
size_t sz = UniSetUDP::UDPMessage::getMessage(*pack, r_buf);
if( sz == 0 ) // конвертируем byte order
{ pack->msg.ntoh();
unetcrit << myname << "(receive): FAILED RECEIVE DATA ret=" << ret << endl;
return false;
}
if( pack->magic != UniSetUDP::UNETUDP_MAGICNUM ) if( pack->msg.header.magic != UniSetUDP::UNETUDP_MAGICNUM )
return false; return false;
if( size_t(abs(long(pack->num - wnum))) > maxDifferens || size_t(abs( long(wnum - rnum) )) >= (cbufSize - 2) ) // cout << "RECV[" << ret << "]: msg: " << pack->msg << endl;
if( size_t(abs(long(pack->msg.header.num - wnum))) > maxDifferens || size_t(abs( long(wnum - rnum) )) >= (cbufSize - 2) )
{ {
unetcrit << myname << "(receive): DISAGREE " unetcrit << myname << "(receive): DISAGREE "
<< " packnum=" << pack->num << " packnum=" << pack->msg.header.num
<< " wnum=" << wnum << " wnum=" << wnum
<< " rnum=" << rnum << " rnum=" << rnum
<< " (maxDiff=" << maxDifferens << " (maxDiff=" << maxDifferens
...@@ -667,40 +657,41 @@ bool UNetReceiver::receive() noexcept ...@@ -667,40 +657,41 @@ bool UNetReceiver::receive() noexcept
<< ")" << ")"
<< endl; << endl;
lostPackets = pack->num > wnum ? (pack->num - wnum - 1) : lostPackets + 1; lostPackets = pack->msg.header.num > wnum ? (pack->msg.header.num - wnum - 1) : lostPackets + 1;
// реинициализируем позицию для чтения // реинициализируем позицию для чтения
rnum = pack->num; rnum = pack->msg.header.num;
wnum = pack->num + 1; wnum = pack->msg.header.num + 1;
// перемещаем пакет в нужное место (если требуется) // перемещаем пакет в нужное место (если требуется)
if( wnum != pack->num ) if( wnum != pack->msg.header.num )
{ {
cbuf[pack->num % cbufSize] = (*pack); cbuf[pack->msg.header.num % cbufSize].msg = pack->msg;
pack->num = 0; pack->msg.header.num = 0;
} }
return true; return true;
} }
if( pack->num != wnum ) if( pack->msg.header.num != wnum )
{ {
// перемещаем пакет в правильное место // перемещаем пакет в правильное место
// в соответствии с его номером // в соответствии с его номером
cbuf[pack->num % cbufSize] = (*pack); cbuf[pack->msg.header.num % cbufSize].msg = pack->msg;
if( pack->num >= wnum ) if( pack->msg.header.num >= wnum )
wnum = pack->num + 1; wnum = pack->msg.header.num + 1;
// обнуляем номер в том месте где записали, чтобы его не обрабатывал update // обнуляем номер в том месте где записали, чтобы его не обрабатывал update
pack->num = 0; pack->msg.header.num = 0;
} }
else if( pack->num >= wnum ) else if( pack->msg.header.num >= wnum )
wnum = pack->num + 1; wnum = pack->msg.header.num + 1;
// начальная инициализация для чтения // начальная инициализация для чтения
if( rnum == 0 ) if( rnum == 0 )
rnum = pack->num; rnum = pack->msg.header.num;
// cout << "FINAL: msg: " << cbuf[(wnum-1) % cbufSize].msg << endl;
return true; return true;
} }
catch( Poco::Net::NetException& ex ) catch( Poco::Net::NetException& ex )
...@@ -745,14 +736,14 @@ UNetReceiver::CacheVec* UNetReceiver::getDCache( UniSetUDP::UDPMessage* pack ) n ...@@ -745,14 +736,14 @@ UNetReceiver::CacheVec* UNetReceiver::getDCache( UniSetUDP::UDPMessage* pack ) n
CacheVec* d_info = &dit->second; CacheVec* d_info = &dit->second;
if( pack->dcount == d_info->size() ) if( pack->header.dcount == d_info->size() )
return d_info; return d_info;
unetinfo << myname << ": init dcache[" << pack->dcount << "] for " << pack->getDataID() << endl; unetinfo << myname << ": init dcache[" << pack->header.dcount << "] for " << pack->getDataID() << endl;
d_info->resize(pack->dcount); d_info->resize(pack->header.dcount);
for( size_t i = 0; i < pack->dcount; i++ ) for( size_t i = 0; i < pack->header.dcount; i++ )
{ {
CacheItem& d = (*d_info)[i]; CacheItem& d = (*d_info)[i];
...@@ -777,14 +768,14 @@ UNetReceiver::CacheVec* UNetReceiver::getACache( UniSetUDP::UDPMessage* pack ) n ...@@ -777,14 +768,14 @@ UNetReceiver::CacheVec* UNetReceiver::getACache( UniSetUDP::UDPMessage* pack ) n
CacheVec* a_info = &ait->second; CacheVec* a_info = &ait->second;
if( pack->acount == a_info->size() ) if( pack->header.acount == a_info->size() )
return a_info; return a_info;
unetinfo << myname << ": init acache[" << pack->acount << "] for " << pack->getDataID() << endl; unetinfo << myname << ": init acache[" << pack->header.acount << "] for " << pack->getDataID() << endl;
a_info->resize(pack->acount); a_info->resize(pack->header.acount);
for( size_t i = 0; i < pack->acount; i++ ) for( size_t i = 0; i < pack->header.acount; i++ )
{ {
CacheItem& d = (*a_info)[i]; CacheItem& d = (*a_info)[i];
......
...@@ -234,18 +234,16 @@ namespace uniset ...@@ -234,18 +234,16 @@ namespace uniset
uniset::ObjectId sidRespond = { uniset::DefaultObjectId }; uniset::ObjectId sidRespond = { uniset::DefaultObjectId };
IOController::IOStateList::iterator itRespond; IOController::IOStateList::iterator itRespond;
bool respondInvert = { false }; bool respondInvert = { false };
uniset::ObjectId sidLostPackets; uniset::ObjectId sidLostPackets = { uniset::DefaultObjectId };
IOController::IOStateList::iterator itLostPackets; IOController::IOStateList::iterator itLostPackets;
std::atomic_bool activated = { false }; std::atomic_bool activated = { false };
size_t cbufSize = { 100 }; /*!< размер буфера для сообщений по умолчанию */ size_t cbufSize = { 100 }; /*!< размер буфера для сообщений по умолчанию */
std::vector<UniSetUDP::UDPMessage> cbuf; // circular buffer std::vector<UniSetUDP::UDPPacket> cbuf; // circular buffer
size_t wnum = { 1 }; /*!< номер следующего ожидаемого пакета */ size_t wnum = { 1 }; /*!< номер следующего ожидаемого пакета */
size_t rnum = { 0 }; /*!< номер последнего обработанного пакета */ size_t rnum = { 0 }; /*!< номер последнего обработанного пакета */
UniSetUDP::UDPPacket* pack; // текущий обрабатываемый пакет
UniSetUDP::UDPMessage* pack;
UniSetUDP::UDPPacket r_buf; /*!< просто буфер для получения очередного сообщения */
/*! максимальная разница между номерами пакетов, при которой считается, что счётчик пакетов /*! максимальная разница между номерами пакетов, при которой считается, что счётчик пакетов
* прошёл через максимум или сбился... * прошёл через максимум или сбился...
......
...@@ -87,8 +87,8 @@ namespace uniset ...@@ -87,8 +87,8 @@ namespace uniset
// выставляем поля, которые не меняются // выставляем поля, которые не меняются
{ {
uniset_rwmutex_wrlock l(mypack.mut); uniset_rwmutex_wrlock l(mypack.mut);
mypack.msg.nodeID = uniset_conf()->getLocalNode(); mypack.p.msg.header.nodeID = uniset_conf()->getLocalNode();
mypack.msg.procID = shm->ID(); mypack.p.msg.header.procID = shm->ID();
} }
// ------------------------------- // -------------------------------
...@@ -200,9 +200,9 @@ namespace uniset ...@@ -200,9 +200,9 @@ namespace uniset
uniset::uniset_rwmutex_wrlock l(mypack.mut); uniset::uniset_rwmutex_wrlock l(mypack.mut);
if( it.iotype == UniversalIO::DI || it.iotype == UniversalIO::DO ) if( it.iotype == UniversalIO::DI || it.iotype == UniversalIO::DO )
mypack.msg.setDData(it.pack_ind, value); mypack.p.msg.setDData(it.pack_ind, value);
else if( it.iotype == UniversalIO::AI || it.iotype == UniversalIO::AO ) else if( it.iotype == UniversalIO::AI || it.iotype == UniversalIO::AO )
mypack.msg.setAData(it.pack_ind, value); mypack.p.msg.setAData(it.pack_ind, value);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::setCheckConnectionPause( int msec ) void UNetSender::setCheckConnectionPause( int msec )
...@@ -313,13 +313,13 @@ namespace uniset ...@@ -313,13 +313,13 @@ namespace uniset
#ifdef UNETUDP_DISABLE_OPTIMIZATION_N1 #ifdef UNETUDP_DISABLE_OPTIMIZATION_N1
mypack.msg.num = packetnum++; mypack.msg.num = packetnum++;
#else #else
uint16_t crc = mypack.msg.getDataCRC(); uint16_t crc = mypack.p.msg.getDataCRC();
if( crc != lastcrc ) if( crc != lastcrc )
{ {
mypack.msg.num = packetnum++; mypack.p.msg.header.num = packetnum++;
lastcrc = crc; lastcrc = crc;
} }
#endif #endif
// при переходе через ноль (когда счётчик перевалит через UniSetUDP::MaxPacketNum.. // при переходе через ноль (когда счётчик перевалит через UniSetUDP::MaxPacketNum..
...@@ -330,12 +330,10 @@ namespace uniset ...@@ -330,12 +330,10 @@ namespace uniset
if( !udp || !udp->poll( UniSetTimer::millisecToPoco(writeTimeout), Poco::Net::Socket::SELECT_WRITE) ) if( !udp || !udp->poll( UniSetTimer::millisecToPoco(writeTimeout), Poco::Net::Socket::SELECT_WRITE) )
return; return;
mypack.msg.transport_msg(s_msg); size_t ret = udp->sendTo(mypack.p.raw, mypack.p.msg.len(), saddr);
size_t ret = udp->sendTo(&s_msg.data, s_msg.len, saddr);
if( ret < s_msg.len ) if( ret < mypack.p.msg.len() )
unetcrit << myname << "(real_send): FAILED ret=" << ret << " < sizeof=" << s_msg.len << endl; unetcrit << myname << "(real_send): FAILED ret=" << ret << " < sizeof=" << mypack.p.msg.len() << endl;
} }
catch( Poco::Net::NetException& ex ) catch( Poco::Net::NetException& ex )
{ {
...@@ -456,7 +454,7 @@ namespace uniset ...@@ -456,7 +454,7 @@ namespace uniset
{ {
uniset_rwmutex_wrlock l(mypack.mut); uniset_rwmutex_wrlock l(mypack.mut);
p.pack_ind = mypack.msg.addDData(sid, defval); p.pack_ind = mypack.p.msg.addDData(sid, defval);
} // unlock mutex.... } // unlock mutex....
if( p.pack_ind >= maxDData ) if( p.pack_ind >= maxDData )
...@@ -468,9 +466,9 @@ namespace uniset ...@@ -468,9 +466,9 @@ namespace uniset
auto& mypack2 = pk[dnum]; auto& mypack2 = pk[dnum];
uniset_rwmutex_wrlock l2(mypack2.mut); uniset_rwmutex_wrlock l2(mypack2.mut);
p.pack_ind = mypack2.msg.addDData(sid, defval); p.pack_ind = mypack2.p.msg.addDData(sid, defval);
mypack2.msg.nodeID = uniset_conf()->getLocalNode(); mypack2.p.msg.header.nodeID = uniset_conf()->getLocalNode();
mypack2.msg.procID = shm->ID(); mypack2.p.msg.header.procID = shm->ID();
} }
p.pack_num = dnum; p.pack_num = dnum;
...@@ -497,7 +495,7 @@ namespace uniset ...@@ -497,7 +495,7 @@ namespace uniset
{ {
uniset_rwmutex_wrlock l(mypack.mut); uniset_rwmutex_wrlock l(mypack.mut);
p.pack_ind = mypack.msg.addAData(sid, defval); p.pack_ind = mypack.p.msg.addAData(sid, defval);
} }
if( p.pack_ind >= maxAData ) if( p.pack_ind >= maxAData )
...@@ -509,9 +507,9 @@ namespace uniset ...@@ -509,9 +507,9 @@ namespace uniset
auto& mypack2 = pk[anum]; auto& mypack2 = pk[anum];
uniset_rwmutex_wrlock l2(mypack2.mut); uniset_rwmutex_wrlock l2(mypack2.mut);
p.pack_ind = mypack2.msg.addAData(sid, defval); p.pack_ind = mypack2.p.msg.addAData(sid, defval);
mypack2.msg.nodeID = uniset_conf()->getLocalNode(); mypack2.p.msg.header.nodeID = uniset_conf()->getLocalNode();
mypack2.msg.procID = shm->ID(); mypack2.p.msg.header.procID = shm->ID();
} }
p.pack_num = anum; p.pack_num = anum;
...@@ -588,11 +586,11 @@ namespace uniset ...@@ -588,11 +586,11 @@ namespace uniset
s << " \t[" << i->first << "]=" << i->second.size() << endl; s << " \t[" << i->first << "]=" << i->second.size() << endl;
size_t n = 0; size_t n = 0;
for( const auto& p : i->second ) for( const auto& pack : i->second )
{ {
//uniset_rwmutex_rlock l(p->mut); //uniset_rwmutex_rlock l(p->mut);
s << " \t\t[" << (n++) << "]=" << p.msg.sizeOf() << " bytes" s << " \t\t[" << (n++) << "]=" << pack.p.msg.len() << " bytes"
<< " ( numA=" << setw(5) << p.msg.asize() << " numD=" << setw(5) << p.msg.dsize() << ")" << " ( numA=" << setw(5) << pack.p.msg.asize() << " numD=" << setw(5) << pack.p.msg.dsize() << ")"
<< endl; << endl;
} }
} }
......
...@@ -59,18 +59,18 @@ static void run_senders( size_t max, const std::string& s_host, size_t count = 5 ...@@ -59,18 +59,18 @@ static void run_senders( size_t max, const std::string& s_host, size_t count = 5
} }
} }
UniSetUDP::UDPMessage mypack; UniSetUDP::UDPPacket mypack;
mypack.nodeID = 100; mypack.msg.header.nodeID = 100;
mypack.procID = 100; mypack.msg.header.procID = 100;
for( size_t i = 0; i < count; i++ ) for( size_t i = 0; i < count; i++ )
{ {
UniSetUDP::UDPAData d(i, i); UniSetUDP::UDPAData d(i, i);
mypack.addAData(d); mypack.msg.addAData(d);
} }
for( size_t i = 0; i < count; i++ ) for( size_t i = 0; i < count; i++ )
mypack.addDData(i, i); mypack.msg.addDData(i, i);
for( size_t i = 0; i < max; i++ ) for( size_t i = 0; i < max; i++ )
{ {
...@@ -92,13 +92,11 @@ static void run_senders( size_t max, const std::string& s_host, size_t count = 5 ...@@ -92,13 +92,11 @@ static void run_senders( size_t max, const std::string& s_host, size_t count = 5
} }
size_t packetnum = 0; size_t packetnum = 0;
UniSetUDP::UDPPacket s_buf;
size_t nc = 1; size_t nc = 1;
while( nc ) // -V654 while( nc ) // -V654
{ {
mypack.num = packetnum++; mypack.msg.header.num = packetnum++;
// при переходе черех максимум (UniSetUDP::MaxPacketNum) // при переходе черех максимум (UniSetUDP::MaxPacketNum)
// пакет опять должен иметь номер "1" // пакет опять должен иметь номер "1"
...@@ -111,11 +109,10 @@ static void run_senders( size_t max, const std::string& s_host, size_t count = 5 ...@@ -111,11 +109,10 @@ static void run_senders( size_t max, const std::string& s_host, size_t count = 5
{ {
if( udp->poll(100000, Poco::Net::Socket::SELECT_WRITE) ) if( udp->poll(100000, Poco::Net::Socket::SELECT_WRITE) )
{ {
mypack.transport_msg(s_buf); size_t ret = udp->sendBytes(mypack.raw, mypack.msg.len());
size_t ret = udp->sendBytes((char*)&s_buf.data, s_buf.len);
if( ret < s_buf.len ) if( ret < mypack.msg.len() )
cerr << "(send): FAILED ret=" << ret << " < sizeof=" << s_buf.len << endl; cerr << "(send): FAILED ret=" << ret << " < sizeof=" << mypack.msg.len() << endl;
} }
} }
catch( Poco::Net::NetException& e ) catch( Poco::Net::NetException& e )
...@@ -180,9 +177,9 @@ int main(int argc, char* argv[] ) ...@@ -180,9 +177,9 @@ int main(int argc, char* argv[] )
auto conf = uniset_init(argc, argv); auto conf = uniset_init(argc, argv);
if( argc > 1 && !strcmp(argv[1], "s") ) if( argc > 1 && !strcmp(argv[1], "s") )
run_senders(1, host); run_senders(10, host);
else else
run_test(1, host); run_test(10, host);
return 0; return 0;
} }
......
...@@ -223,9 +223,7 @@ int main(int argc, char* argv[]) ...@@ -223,9 +223,7 @@ int main(int argc, char* argv[])
{ {
UDPReceiveU udp(s_host, port); UDPReceiveU udp(s_host, port);
// char buf[UniSetUDP::MaxDataLen]; UniSetUDP::UDPPacket pack;
UniSetUDP::UDPMessage pack;
UniSetUDP::UDPPacket buf;
unsigned long prev_num = 1; unsigned long prev_num = 1;
int nc = 1; int nc = 1;
...@@ -257,27 +255,35 @@ int main(int argc, char* argv[]) ...@@ -257,27 +255,35 @@ int main(int argc, char* argv[])
continue; continue;
} }
size_t ret = udp.receiveBytes(&(buf.data), sizeof(buf.data) ); size_t ret = udp.receiveBytes(pack.raw, sizeof(pack.raw) );
size_t sz = UniSetUDP::UDPMessage::getMessage(pack, buf);
if( sz == 0 ) if( ret < 0 )
{ {
if( pack.magic != UniSetUDP::UNETUDP_MAGICNUM ) cerr << "(recv): no data?!" << endl;
cerr << "(recv): BAD PROTOCOL VERSION! [ need version '" << UniSetUDP::UNETUDP_MAGICNUM << "']" << endl; continue;
else }
cerr << "(recv): FAILED header ret=" << ret
<< " sizeof=" << sz << endl; if( ret == 0 )
{
cerr << "(recv): connection closed?!" << endl;
continue;
}
pack.msg.ntoh();
if( pack.msg.header.magic != UniSetUDP::UNETUDP_MAGICNUM )
{
cerr << "(recv): BAD PROTOCOL VERSION! [ need version '" << UniSetUDP::UNETUDP_MAGICNUM << "']" << endl;
continue; continue;
} }
if( lost ) if( lost )
{ {
if( prev_num != (pack.num - 1) ) if( prev_num != (pack.msg.header.num - 1) )
cerr << "WARNING! Incorrect sequence of packets! current=" << pack.num cerr << "WARNING! Incorrect sequence of packets! current=" << pack.msg.header.num
<< " prev=" << prev_num << endl; << " prev=" << prev_num << endl;
prev_num = pack.num; prev_num = pack.msg.header.num;
} }
npack++; npack++;
...@@ -287,7 +293,7 @@ int main(int argc, char* argv[]) ...@@ -287,7 +293,7 @@ int main(int argc, char* argv[])
<< " bytes: " << ret << endl; << " bytes: " << ret << endl;
if( show ) if( show )
cout << "receive data: " << pack << endl; cout << "receive data: " << pack.msg << endl;
} }
catch( Poco::Net::NetException& e ) catch( Poco::Net::NetException& e )
{ {
...@@ -314,9 +320,10 @@ int main(int argc, char* argv[]) ...@@ -314,9 +320,10 @@ int main(int argc, char* argv[])
std::shared_ptr<UDPSocketU> udp = make_shared<UDPSocketU>(s_host, port); std::shared_ptr<UDPSocketU> udp = make_shared<UDPSocketU>(s_host, port);
udp->setBroadcast(broadcast); udp->setBroadcast(broadcast);
UniSetUDP::UDPMessage mypack; UniSetUDP::UDPPacket mypack;
mypack.nodeID = nodeID; UDPMessage* msg = &mypack.msg;
mypack.procID = procID; msg->header.nodeID = nodeID;
msg->header.procID = procID;
if( !a_data.empty() ) if( !a_data.empty() )
{ {
...@@ -325,7 +332,7 @@ int main(int argc, char* argv[]) ...@@ -325,7 +332,7 @@ int main(int argc, char* argv[])
for( const auto& v : vlist ) for( const auto& v : vlist )
{ {
UDPAData d(v.si.id, v.val); UDPAData d(v.si.id, v.val);
mypack.addAData(d); msg->addAData(d);
} }
} }
else else
...@@ -333,7 +340,7 @@ int main(int argc, char* argv[]) ...@@ -333,7 +340,7 @@ int main(int argc, char* argv[])
for( size_t i = 0; i < count; i++ ) for( size_t i = 0; i < count; i++ )
{ {
UDPAData d(i, i); UDPAData d(i, i);
mypack.addAData(d); msg->addAData(d);
} }
} }
...@@ -342,19 +349,17 @@ int main(int argc, char* argv[]) ...@@ -342,19 +349,17 @@ int main(int argc, char* argv[])
auto vlist = uniset::getSInfoList(d_data, nullptr); auto vlist = uniset::getSInfoList(d_data, nullptr);
for( const auto& v : vlist ) for( const auto& v : vlist )
mypack.addDData(v.si.id, v.val); msg->addDData(v.si.id, v.val);
} }
else else
{ {
for( size_t i = 0; i < count; i++ ) for( size_t i = 0; i < count; i++ )
mypack.addDData(i, i); msg->addDData(i, i);
} }
Poco::Net::SocketAddress sa(s_host, port); Poco::Net::SocketAddress sa(s_host, port);
udp->connect(sa); udp->connect(sa);
UniSetUDP::UDPPacket s_buf;
size_t nc = 1; size_t nc = 1;
if( ncycles > 0 ) if( ncycles > 0 )
...@@ -362,7 +367,7 @@ int main(int argc, char* argv[]) ...@@ -362,7 +367,7 @@ int main(int argc, char* argv[])
while( nc ) while( nc )
{ {
mypack.num = packetnum++; msg->header.num = packetnum++;
// при переходе через максимум (UniSetUDP::MaxPacketNum) // при переходе через максимум (UniSetUDP::MaxPacketNum)
// пакет опять должен иметь номер "1" // пакет опять должен иметь номер "1"
...@@ -373,16 +378,14 @@ int main(int argc, char* argv[]) ...@@ -373,16 +378,14 @@ int main(int argc, char* argv[])
{ {
if( udp->poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_WRITE) ) if( udp->poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_WRITE) )
{ {
mypack.transport_msg(s_buf);
if( verb ) if( verb )
cout << "(send): to addr=" << addr << " d_count=" << mypack.dcount cout << "(send): to addr=" << addr << " d_count=" << msg->header.dcount
<< " a_count=" << mypack.acount << " bytes=" << s_buf.len << endl; << " a_count=" << msg->header.acount << " bytes=" << msg->len() << endl;
size_t ret = udp->sendBytes((char*)&s_buf.data, s_buf.len); size_t ret = udp->sendBytes(mypack.raw, sizeof(mypack.raw) /* mypack.msg.len() */);
if( ret < s_buf.len ) if( ret < msg->len() )
cerr << "(send): FAILED ret=" << ret << " < sizeof=" << s_buf.len << endl; cerr << "(send): FAILED ret=" << ret << " < sizeof=" << msg->len() << endl;
} }
} }
catch( Poco::Net::NetException& e ) catch( Poco::Net::NetException& e )
......
...@@ -195,43 +195,6 @@ ...@@ -195,43 +195,6 @@
./extensions/SMViewer/Makefile.am ./extensions/SMViewer/Makefile.am
./extensions/SMViewer/SMViewer.cc ./extensions/SMViewer/SMViewer.cc
./extensions/SMViewer/SMViewer.h ./extensions/SMViewer/SMViewer.h
./extensions/tests1/Makefile.am
./extensions/tests1/MBSlaveTest/Makefile.am
./extensions/tests1/MBSlaveTest/mbslave-test.cc
./extensions/tests1/MBSlaveTest/TestProc.cc
./extensions/tests1/MBSlaveTest/TestProc.h
./extensions/tests1/MBSlaveTest/testproc.src.xml
./extensions/tests1/MQPerfTest/Makefile.am
./extensions/tests1/MQPerfTest/mq-test.cc
./extensions/tests1/MQPerfTest/TestProc.cc
./extensions/tests1/MQPerfTest/TestProc.h
./extensions/tests1/MQPerfTest/testproc.src.xml
./extensions/tests1/r/t.cc
./extensions/tests1/SMemoryTest/LostPassiveTestProc.cc
./extensions/tests1/SMemoryTest/LostPassiveTestProc.h
./extensions/tests1/SMemoryTest/LostTestProc.cc
./extensions/tests1/SMemoryTest/LostTestProc.h
./extensions/tests1/SMemoryTest/losttestproc.src.xml
./extensions/tests1/SMemoryTest/Makefile.am
./extensions/tests1/SMemoryTest/smemory-test.cc
./extensions/tests1/SMemoryTest/sm-lostmessage-test.cc
./extensions/tests1/SMemoryTest/TestProc.cc
./extensions/tests1/SMemoryTest/TestProc.h
./extensions/tests1/SMemoryTest/testproc.src.xml
./extensions/tests1/sm_perf_test2.cc
./extensions/tests1/sm_perf_test.cc
./extensions/tests1/sz.cc
./extensions/tests1/test_calibration.cc
./extensions/tests1/test_digitalfilter.cc
./extensions/tests1/test_iobase.cc
./extensions/tests1/test_iobase_with_sm.cc
./extensions/tests1/test_restapi_uniset.cc
./extensions/tests1/tests.cc
./extensions/tests1/tests_with_conf.cc
./extensions/tests1/tests_with_sm.cc
./extensions/tests1/tests_with_sm.h
./extensions/tests1/test_ui.cc
./extensions/tests1/test_vtypes.cc
./extensions/tests/Makefile.am ./extensions/tests/Makefile.am
./extensions/tests/MBSlaveTest/Makefile.am ./extensions/tests/MBSlaveTest/Makefile.am
./extensions/tests/MBSlaveTest/mbslave-test.cc ./extensions/tests/MBSlaveTest/mbslave-test.cc
......
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