Commit 77df5938 authored by Pavel Vainerman's avatar Pavel Vainerman

[unet]: const size

parent 94e22ed7
...@@ -263,20 +263,9 @@ namespace uniset ...@@ -263,20 +263,9 @@ namespace uniset
return header.num; return header.num;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
size_t UniSetUDP::UDPMessage::len() const noexcept
{
return UniSetUDP::MaxDataLen;
// биты которые не уместились в очередной байт, добавляют ещё один байт
// size_t nbit = header.dcount % 8 * sizeof(uint8_t);
// size_t add = nbit > 0 ? 1 : 0;
// return sizeof(header) + header.acount * sizeof(UDPAData) + header.dcount * sizeof(long) + (header.dcount / 8 * sizeof(uint8_t) + add);
}
// -----------------------------------------------------------------------------
bool UDPMessage::isOk() noexcept bool UDPMessage::isOk() noexcept
{ {
return ( header.magic != UniSetUDP::UNETUDP_MAGICNUM ); return ( header.magic == UniSetUDP::UNETUDP_MAGICNUM );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UDPMessage::ntoh() noexcept void UDPMessage::ntoh() noexcept
......
...@@ -27,15 +27,11 @@ namespace uniset ...@@ -27,15 +27,11 @@ namespace uniset
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
namespace UniSetUDP namespace UniSetUDP
{ {
/*! Для оптимизации размера передаваемых данных, но с учётом того, что ID могут идти не подряд. /*! С учётом того, что ID могут идти не подряд. Сделан следующий формат:
Сделан следующий формат:
Для аналоговых величин передаётся массив пар "id-value"(UDPAData). Для аналоговых величин передаётся массив пар "id-value"(UDPAData).
Для булевых величин - отдельно массив ID и отдельно битовый массив со значениями, Для булевых величин - отдельно массив ID и отдельно битовый массив со значениями,
(по количеству битов такого же размера). (по количеству битов такого же размера).
\todo Подумать на тему сделать два отдельных вида пакетов для булевых значений и для аналоговых,
чтобы уйти от преобразования UDPMessage --> UDPPacket --> UDPMessage.
\warning ТЕКУЩАЯ ВЕРСИЯ ПРОТОКОЛА НЕ БУДЕТ РАБОТАТЬ МЕЖДУ 32-битными и 64-битными системами (из-за отличия в типе long). \warning ТЕКУЩАЯ ВЕРСИЯ ПРОТОКОЛА НЕ БУДЕТ РАБОТАТЬ МЕЖДУ 32-битными и 64-битными системами (из-за отличия в типе long).
т.к. это не сильно актуально, пока не переделываю. т.к. это не сильно актуально, пока не переделываю.
...@@ -83,13 +79,10 @@ namespace uniset ...@@ -83,13 +79,10 @@ namespace uniset
// Теоретический размер данных в UDP пакете (исключая заголовки) 65507 // Теоретический размер данных в UDP пакете (исключая заголовки) 65507
// Фактически желательно не вылезать за размер MTU (обычно 1500) - заголовки = 1432 байта // Фактически желательно не вылезать за размер MTU (обычно 1500) - заголовки = 1432 байта
// т.е. надо чтобы sizeof(UDPPacket) < 1432 // т.е. надо чтобы sizeof(UDPPacket) < 1432
// с другой стороны в текущей реализации // При текущих настройках sizeof(UDPPacket) = 56421 (!)
// в сеть посылается фактическое количество данных, а не sizeof(UDPPacket). static const size_t MaxACount = 2000;
// При текущих настройках sizeof(UDPPacket) = 72679 (!)
static const size_t MaxACount = 1000;
static const size_t MaxDCount = 3000; static const size_t MaxDCount = 3000;
static const size_t MaxDDataCount = 1 + MaxDCount / 8 * sizeof(unsigned char); static const size_t MaxDDataCount = 1 + MaxDCount / 8 * sizeof(uint8_t);
struct UDPMessage struct UDPMessage
{ {
...@@ -143,17 +136,8 @@ namespace uniset ...@@ -143,17 +136,8 @@ namespace uniset
return header.acount; return header.acount;
} }
// размер итогового пакета в байтах
size_t len() const noexcept;
uint16_t getDataCRC() const noexcept; uint16_t getDataCRC() const noexcept;
// количество байт в пакете с булевыми переменными...
size_t d_byte() const noexcept
{
return header.dcount * sizeof(long) + header.dcount;
}
UDPHeader header; UDPHeader header;
UDPAData a_dat[MaxACount]; /*!< аналоговые величины */ UDPAData a_dat[MaxACount]; /*!< аналоговые величины */
long d_id[MaxDCount]; /*!< список дискретных ID */ long d_id[MaxDCount]; /*!< список дискретных ID */
...@@ -163,15 +147,6 @@ namespace uniset ...@@ -163,15 +147,6 @@ namespace uniset
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
......
...@@ -29,7 +29,6 @@ using namespace uniset; ...@@ -29,7 +29,6 @@ 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
...@@ -337,7 +336,7 @@ size_t UNetReceiver::rnext( size_t num ) ...@@ -337,7 +336,7 @@ size_t UNetReceiver::rnext( size_t num )
while( i < wnum ) while( i < wnum )
{ {
p = &cbuf[i % cbufSize].msg; p = &cbuf[i % cbufSize];
if( p->header.num > num ) if( p->header.num > num )
return i; return i;
...@@ -363,9 +362,7 @@ void UNetReceiver::update() noexcept ...@@ -363,9 +362,7 @@ void UNetReceiver::update() noexcept
// либо обнаружится "дырка" в последовательности, // либо обнаружится "дырка" в последовательности,
while( rnum < wnum ) while( rnum < wnum )
{ {
p = &(cbuf[rnum % cbufSize].msg); p = &(cbuf[rnum % cbufSize]);
// cout << "update: num=" << p->header.num << " rnum=" << rnum << " wnum=" << wnum << endl;
// если номер пакета не равен ожидаемому, ждём считая что это "дырка" // если номер пакета не равен ожидаемому, ждём считая что это "дырка"
// т.к. разрывы и другие случаи обрабатываются при приёме пакетов // т.к. разрывы и другие случаи обрабатываются при приёме пакетов
...@@ -391,6 +388,10 @@ void UNetReceiver::update() noexcept ...@@ -391,6 +388,10 @@ void UNetReceiver::update() noexcept
rnum++; rnum++;
upCount++; upCount++;
// обновление данных в SM (блокировано)
if( lockUpdate )
continue;
// Обработка дискретных // Обработка дискретных
auto d_iv = getDCache(p); auto d_iv = getDCache(p);
...@@ -408,10 +409,6 @@ void UNetReceiver::update() noexcept ...@@ -408,10 +409,6 @@ void UNetReceiver::update() noexcept
shm->initIterator(c_it->ioit); shm->initIterator(c_it->ioit);
} }
// обновление данных в SM (блокировано)
if( lockUpdate )
continue;
shm->localSetValue(c_it->ioit, s_id, p->dValue(i), shm->ID()); shm->localSetValue(c_it->ioit, s_id, p->dValue(i), shm->ID());
} }
catch( const uniset::Exception& ex) catch( const uniset::Exception& ex)
...@@ -449,10 +446,6 @@ void UNetReceiver::update() noexcept ...@@ -449,10 +446,6 @@ void UNetReceiver::update() noexcept
shm->initIterator(c_it->ioit); shm->initIterator(c_it->ioit);
} }
// обновление данных в SM (блокировано)
if( lockUpdate )
continue;
shm->localSetValue(c_it->ioit, dat->id, dat->val, shm->ID()); shm->localSetValue(c_it->ioit, dat->id, dat->val, shm->ID());
} }
catch( const uniset::Exception& ex) catch( const uniset::Exception& ex)
...@@ -624,7 +617,7 @@ bool UNetReceiver::receive() noexcept ...@@ -624,7 +617,7 @@ bool UNetReceiver::receive() noexcept
{ {
// сперва пробуем сохранить пакет в том месте, где должен быть очередной пакет // сперва пробуем сохранить пакет в том месте, где должен быть очередной пакет
pack = &(cbuf[wnum % cbufSize]); pack = &(cbuf[wnum % cbufSize]);
ssize_t ret = udp->receiveBytes(pack->raw, sizeof(pack->raw) /* UniSetUDP::MaxDataLen */); ssize_t ret = udp->receiveBytes(pack, sizeof(UniSetUDP::UDPMessage));
if( ret < 0 ) if( ret < 0 )
{ {
...@@ -641,17 +634,15 @@ bool UNetReceiver::receive() noexcept ...@@ -641,17 +634,15 @@ bool UNetReceiver::receive() noexcept
recvCount++; recvCount++;
// конвертируем byte order // конвертируем byte order
pack->msg.ntoh(); pack->ntoh();
if( pack->msg.header.magic != UniSetUDP::UNETUDP_MAGICNUM ) if( !pack->isOk() )
return false; return false;
// cout << "RECV[" << ret << "]: msg: " << pack->msg << endl; if( size_t(abs(long(pack->header.num - wnum))) > maxDifferens || size_t(abs( long(wnum - rnum) )) >= (cbufSize - 2) )
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->msg.header.num << " packnum=" << pack->header.num
<< " wnum=" << wnum << " wnum=" << wnum
<< " rnum=" << rnum << " rnum=" << rnum
<< " (maxDiff=" << maxDifferens << " (maxDiff=" << maxDifferens
...@@ -659,41 +650,40 @@ bool UNetReceiver::receive() noexcept ...@@ -659,41 +650,40 @@ bool UNetReceiver::receive() noexcept
<< ")" << ")"
<< endl; << endl;
lostPackets = pack->msg.header.num > wnum ? (pack->msg.header.num - wnum - 1) : lostPackets + 1; lostPackets = pack->header.num > wnum ? (pack->header.num - wnum - 1) : lostPackets + 1;
// реинициализируем позицию для чтения // реинициализируем позицию для чтения
rnum = pack->msg.header.num; rnum = pack->header.num;
wnum = pack->msg.header.num + 1; wnum = pack->header.num + 1;
// перемещаем пакет в нужное место (если требуется) // перемещаем пакет в нужное место (если требуется)
if( wnum != pack->msg.header.num ) if( wnum != pack->header.num )
{ {
cbuf[pack->msg.header.num % cbufSize].msg = pack->msg; cbuf[pack->header.num % cbufSize] = (*pack);
pack->msg.header.num = 0; pack->header.num = 0;
} }
return true; return true;
} }
if( pack->msg.header.num != wnum ) if( pack->header.num != wnum )
{ {
// перемещаем пакет в правильное место // перемещаем пакет в правильное место
// в соответствии с его номером // в соответствии с его номером
cbuf[pack->msg.header.num % cbufSize].msg = pack->msg; cbuf[pack->header.num % cbufSize] = (*pack);
if( pack->msg.header.num >= wnum ) if( pack->header.num >= wnum )
wnum = pack->msg.header.num + 1; wnum = pack->header.num + 1;
// обнуляем номер в том месте где записали, чтобы его не обрабатывал update // обнуляем номер в том месте где записали, чтобы его не обрабатывал update
pack->msg.header.num = 0; pack->header.num = 0;
} }
else if( pack->msg.header.num >= wnum ) else if( pack->header.num >= wnum )
wnum = pack->msg.header.num + 1; wnum = pack->header.num + 1;
// начальная инициализация для чтения // начальная инициализация для чтения
if( rnum == 0 ) if( rnum == 0 )
rnum = pack->msg.header.num; rnum = pack->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 )
......
...@@ -240,10 +240,10 @@ namespace uniset ...@@ -240,10 +240,10 @@ namespace uniset
std::atomic_bool activated = { false }; std::atomic_bool activated = { false };
size_t cbufSize = { 100 }; /*!< размер буфера для сообщений по умолчанию */ size_t cbufSize = { 100 }; /*!< размер буфера для сообщений по умолчанию */
std::vector<UniSetUDP::UDPPacket> cbuf; // circular buffer std::vector<UniSetUDP::UDPMessage> 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; // текущий обрабатываемый пакет
/*! максимальная разница между номерами пакетов, при которой считается, что счётчик пакетов /*! максимальная разница между номерами пакетов, при которой считается, что счётчик пакетов
* прошёл через максимум или сбился... * прошёл через максимум или сбился...
......
...@@ -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.p.msg.header.nodeID = uniset_conf()->getLocalNode(); mypack.msg.header.nodeID = uniset_conf()->getLocalNode();
mypack.p.msg.header.procID = shm->ID(); mypack.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.p.msg.setDData(it.pack_ind, value); mypack.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.p.msg.setAData(it.pack_ind, value); mypack.msg.setAData(it.pack_ind, value);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::setCheckConnectionPause( int msec ) void UNetSender::setCheckConnectionPause( int msec )
...@@ -313,11 +313,11 @@ namespace uniset ...@@ -313,11 +313,11 @@ 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.p.msg.getDataCRC(); uint16_t crc = mypack.msg.getDataCRC();
if( crc != lastcrc ) if( crc != lastcrc )
{ {
mypack.p.msg.header.num = packetnum++; mypack.msg.header.num = packetnum++;
lastcrc = crc; lastcrc = crc;
} }
...@@ -331,10 +331,10 @@ namespace uniset ...@@ -331,10 +331,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;
size_t ret = udp->sendTo(mypack.p.raw, mypack.p.msg.len(), saddr); size_t ret = udp->sendTo(&mypack.msg, sizeof(mypack.msg), saddr);
if( ret < mypack.p.msg.len() ) if( ret < sizeof(mypack.msg) )
unetcrit << myname << "(real_send): FAILED ret=" << ret << " < sizeof=" << mypack.p.msg.len() << endl; unetcrit << myname << "(real_send): FAILED ret=" << ret << " < sizeof=" << sizeof(mypack.msg) << endl;
} }
catch( Poco::Net::NetException& ex ) catch( Poco::Net::NetException& ex )
{ {
...@@ -455,7 +455,7 @@ namespace uniset ...@@ -455,7 +455,7 @@ namespace uniset
{ {
uniset_rwmutex_wrlock l(mypack.mut); uniset_rwmutex_wrlock l(mypack.mut);
p.pack_ind = mypack.p.msg.addDData(sid, defval); p.pack_ind = mypack.msg.addDData(sid, defval);
} // unlock mutex.... } // unlock mutex....
if( p.pack_ind >= maxDData ) if( p.pack_ind >= maxDData )
...@@ -467,9 +467,9 @@ namespace uniset ...@@ -467,9 +467,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.p.msg.addDData(sid, defval); p.pack_ind = mypack2.msg.addDData(sid, defval);
mypack2.p.msg.header.nodeID = uniset_conf()->getLocalNode(); mypack2.msg.header.nodeID = uniset_conf()->getLocalNode();
mypack2.p.msg.header.procID = shm->ID(); mypack2.msg.header.procID = shm->ID();
} }
p.pack_num = dnum; p.pack_num = dnum;
...@@ -496,7 +496,7 @@ namespace uniset ...@@ -496,7 +496,7 @@ namespace uniset
{ {
uniset_rwmutex_wrlock l(mypack.mut); uniset_rwmutex_wrlock l(mypack.mut);
p.pack_ind = mypack.p.msg.addAData(sid, defval); p.pack_ind = mypack.msg.addAData(sid, defval);
} }
if( p.pack_ind >= maxAData ) if( p.pack_ind >= maxAData )
...@@ -508,9 +508,9 @@ namespace uniset ...@@ -508,9 +508,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.p.msg.addAData(sid, defval); p.pack_ind = mypack2.msg.addAData(sid, defval);
mypack2.p.msg.header.nodeID = uniset_conf()->getLocalNode(); mypack2.msg.header.nodeID = uniset_conf()->getLocalNode();
mypack2.p.msg.header.procID = shm->ID(); mypack2.msg.header.procID = shm->ID();
} }
p.pack_num = anum; p.pack_num = anum;
...@@ -590,8 +590,8 @@ namespace uniset ...@@ -590,8 +590,8 @@ namespace uniset
for( const auto& pack : i->second ) for( const auto& pack : i->second )
{ {
//uniset_rwmutex_rlock l(p->mut); //uniset_rwmutex_rlock l(p->mut);
s << " \t\t[" << (n++) << "]=" << pack.p.msg.len() << " bytes" s << " \t\t[" << (n++) << "]=" << sizeof(pack.msg) << " bytes"
<< " ( numA=" << setw(5) << pack.p.msg.asize() << " numD=" << setw(5) << pack.p.msg.dsize() << ")" << " ( numA=" << setw(5) << pack.msg.asize() << " numD=" << setw(5) << pack.msg.dsize() << ")"
<< endl; << endl;
} }
} }
......
...@@ -114,12 +114,12 @@ namespace uniset ...@@ -114,12 +114,12 @@ namespace uniset
struct PackMessage struct PackMessage
{ {
PackMessage( uniset::UniSetUDP::UDPPacket&& p ) noexcept: p(std::move(p)) {} PackMessage( uniset::UniSetUDP::UDPMessage&& m ) noexcept: msg(std::move(m)) {}
PackMessage( const uniset::UniSetUDP::UDPPacket& p ) = delete; PackMessage( const uniset::UniSetUDP::UDPMessage& m ) = delete;
PackMessage() noexcept {} PackMessage() noexcept {}
uniset::UniSetUDP::UDPPacket p; uniset::UniSetUDP::UDPMessage msg;
uniset::uniset_rwmutex mut; uniset::uniset_rwmutex mut;
}; };
......
...@@ -57,21 +57,21 @@ void InitTest() ...@@ -57,21 +57,21 @@ void InitTest()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// pnum - минималный номер ожидаемого пакета ( 0 - любой пришедщий ) // pnum - минималный номер ожидаемого пакета ( 0 - любой пришедщий )
// ncycle - сколько пакетов разрешено "пропустить" прежде чем дождёмся нужного. (чтобы не ждать бесконечно) // ncycle - сколько пакетов разрешено "пропустить" прежде чем дождёмся нужного. (чтобы не ждать бесконечно)
static UniSetUDP::UDPPacket receive( unsigned int pnum = 0, timeout_t tout = 2000, int ncycle = 20 ) static UniSetUDP::UDPMessage receive( unsigned int pnum = 0, timeout_t tout = 2000, int ncycle = 20 )
{ {
UniSetUDP::UDPPacket pack; UniSetUDP::UDPMessage pack;
while( ncycle > 0 ) while( ncycle > 0 )
{ {
if( !udp_r->poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_READ) ) if( !udp_r->poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_READ) )
break; break;
size_t ret = udp_r->receiveBytes(pack.raw, sizeof(pack.raw) ); size_t ret = udp_r->receiveBytes(&pack, sizeof(pack) );
if( ret <= 0 || pnum == 0 || ( pnum > 0 && pack.msg.header.num >= pnum ) ) // -V560 if( ret <= 0 || pnum == 0 || ( pnum > 0 && pack.header.num >= pnum ) ) // -V560
break; break;
REQUIRE( pack.msg.header.magic == UniSetUDP::UNETUDP_MAGICNUM ); REQUIRE( pack.header.magic == UniSetUDP::UNETUDP_MAGICNUM );
ncycle--; ncycle--;
} }
...@@ -81,50 +81,48 @@ static UniSetUDP::UDPPacket receive( unsigned int pnum = 0, timeout_t tout = 200 ...@@ -81,50 +81,48 @@ static UniSetUDP::UDPPacket receive( unsigned int pnum = 0, timeout_t tout = 200
return pack; return pack;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void send( UniSetUDP::UDPPacket& pack, int tout = 2000 ) void send( UniSetUDP::UDPMessage& pack, int tout = 2000 )
{ {
CHECK( udp_s->poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_WRITE) ); CHECK( udp_s->poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_WRITE) );
pack.msg.header.nodeID = s_nodeID; pack.header.nodeID = s_nodeID;
pack.msg.header.procID = s_procID; pack.header.procID = s_procID;
pack.msg.header.num = s_numpack++; pack.header.num = s_numpack++;
size_t ret = udp_s->sendTo(pack.raw, pack.msg.len(), s_addr); size_t ret = udp_s->sendTo(&pack, sizeof(pack), s_addr);
REQUIRE( ret == pack.msg.len() ); REQUIRE( ret == sizeof(pack) );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
TEST_CASE("[UNetUDP]: repack", "[unetudp][repack]") TEST_CASE("[UNetUDP]: repack", "[unetudp][repack]")
{ {
UniSetUDP::UDPPacket pack; UniSetUDP::UDPMessage pack;
pack.msg.header.nodeID = 100; pack.header.nodeID = 100;
pack.msg.header.procID = 100; pack.header.procID = 100;
pack.msg.header.num = 1; pack.header.num = 1;
pack.msg.addDData(1,1); pack.addDData(1, 1);
pack.msg.addDData(2,0); pack.addDData(2, 0);
pack.msg.addAData(3,30); pack.addAData(3, 30);
pack.msg.addAData(4,40); pack.addAData(4, 40);
REQUIRE(pack.msg.header.magic == UniSetUDP::UNETUDP_MAGICNUM); REQUIRE(pack.header.magic == UniSetUDP::UNETUDP_MAGICNUM);
UniSetUDP::UDPPacket pack2; UniSetUDP::UDPMessage pack2(pack);
memcpy(pack2.raw, pack.raw, sizeof(pack2.raw)); pack2.ntoh();
pack2.msg.ntoh(); REQUIRE(pack2.header.nodeID == 100);
REQUIRE(pack2.header.procID == 100);
REQUIRE(pack2.msg.header.nodeID == 100); REQUIRE(pack2.header.num == 1);
REQUIRE(pack2.msg.header.procID == 100); REQUIRE(pack2.header.magic == UniSetUDP::UNETUDP_MAGICNUM);
REQUIRE(pack2.msg.header.num == 1); REQUIRE(pack2.dID(0) == 1);
REQUIRE(pack2.msg.header.magic == UniSetUDP::UNETUDP_MAGICNUM); REQUIRE(pack2.dValue(0) == true);
REQUIRE(pack2.msg.dID(0) == 1); REQUIRE(pack2.dID(1) == 2);
REQUIRE(pack2.msg.dValue(0) == true); REQUIRE(pack2.dValue(1) == false);
REQUIRE(pack2.msg.dID(1) == 2); REQUIRE(pack2.dID(1) == 2);
REQUIRE(pack2.msg.dValue(1) == false); REQUIRE(pack2.a_dat[0].id == 3);
REQUIRE(pack2.msg.dID(1) == 2); REQUIRE(pack2.a_dat[0].val == 30);
REQUIRE(pack2.msg.a_dat[0].id == 3); REQUIRE(pack2.a_dat[1].id == 4);
REQUIRE(pack2.msg.a_dat[0].val == 30); REQUIRE(pack2.a_dat[1].val == 40);
REQUIRE(pack2.msg.a_dat[1].id == 4);
REQUIRE(pack2.msg.a_dat[1].val == 40);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
TEST_CASE("[UNetUDP]: UDPMessage", "[unetudp][udpmessage]") TEST_CASE("[UNetUDP]: UDPMessage", "[unetudp][udpmessage]")
...@@ -155,17 +153,6 @@ TEST_CASE("[UNetUDP]: UDPMessage", "[unetudp][udpmessage]") ...@@ -155,17 +153,6 @@ TEST_CASE("[UNetUDP]: UDPMessage", "[unetudp][udpmessage]")
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
TEST_CASE("[UNetUDP]: len", "[unetudp][len]")
{
UniSetUDP::UDPPacket p;
REQUIRE( p.msg.len() == sizeof(UniSetUDP::UDPHeader) );
p.msg.addAData(8, 70);
REQUIRE( p.msg.len() == sizeof(UniSetUDP::UDPHeader) + sizeof(UniSetUDP::UDPAData) );
}
// -----------------------------------------------------------------------------
#if 0 #if 0
TEST_CASE("[UNetUDP]: respond sensor", "[unetudp]") TEST_CASE("[UNetUDP]: respond sensor", "[unetudp]")
{ {
...@@ -187,68 +174,68 @@ TEST_CASE("[UNetUDP]: check sender", "[unetudp][sender]") ...@@ -187,68 +174,68 @@ TEST_CASE("[UNetUDP]: check sender", "[unetudp][sender]")
SECTION("Test: read default pack..") SECTION("Test: read default pack..")
{ {
UniSetUDP::UDPPacket p = receive(); UniSetUDP::UDPMessage p = receive();
REQUIRE( p.msg.header.num != 0 ); REQUIRE( p.header.num != 0 );
REQUIRE( p.msg.asize() == 4 ); REQUIRE( p.asize() == 4 );
REQUIRE( p.msg.dsize() == 2 ); REQUIRE( p.dsize() == 2 );
for( size_t i = 0; i < p.msg.asize(); i++ ) for( size_t i = 0; i < p.asize(); i++ )
{ {
REQUIRE( p.msg.a_dat[i].val == i + 1 ); REQUIRE( p.a_dat[i].val == i + 1 );
} }
REQUIRE( p.msg.dValue(0) == true ); REQUIRE( p.dValue(0) == true );
REQUIRE( p.msg.dValue(1) == false ); REQUIRE( p.dValue(1) == false );
// т.к. данные в SM не менялись, то должен придти пакет с тем же номером что и был. // т.к. данные в SM не менялись, то должен придти пакет с тем же номером что и был.
UniSetUDP::UDPPacket p2 = receive(); UniSetUDP::UDPMessage p2 = receive();
REQUIRE( p2.msg.header.num == p.msg.header.num ); REQUIRE( p2.header.num == p.header.num );
} }
SECTION("Test: change AI data..") SECTION("Test: change AI data..")
{ {
UniSetUDP::UDPPacket pack0 = receive(); UniSetUDP::UDPMessage pack0 = receive();
ui->setValue(2, 100); ui->setValue(2, 100);
REQUIRE( ui->getValue(2) == 100 ); REQUIRE( ui->getValue(2) == 100 );
msleep(120); msleep(120);
UniSetUDP::UDPPacket pack = receive( pack0.msg.header.num + 1 ); UniSetUDP::UDPMessage pack = receive( pack0.header.num + 1 );
REQUIRE( pack.msg.header.num != 0 ); REQUIRE( pack.header.num != 0 );
REQUIRE( pack.msg.asize() == 4 ); REQUIRE( pack.asize() == 4 );
REQUIRE( pack.msg.dsize() == 2 ); REQUIRE( pack.dsize() == 2 );
REQUIRE( pack.msg.a_dat[0].val == 100 ); REQUIRE( pack.a_dat[0].val == 100 );
ui->setValue(2, 250); ui->setValue(2, 250);
REQUIRE( ui->getValue(2) == 250 ); REQUIRE( ui->getValue(2) == 250 );
msleep(120); msleep(120);
UniSetUDP::UDPPacket pack2 = receive( pack.msg.header.num + 1 ); UniSetUDP::UDPMessage pack2 = receive( pack.header.num + 1 );
REQUIRE( pack2.msg.header.num != 0 ); REQUIRE( pack2.header.num != 0 );
REQUIRE( pack2.msg.header.num > pack.msg.header.num ); REQUIRE( pack2.header.num > pack.header.num );
REQUIRE( pack2.msg.asize() == 4 ); REQUIRE( pack2.asize() == 4 );
REQUIRE( pack2.msg.dsize() == 2 ); REQUIRE( pack2.dsize() == 2 );
REQUIRE( pack2.msg.a_dat[0].val == 250 ); REQUIRE( pack2.a_dat[0].val == 250 );
} }
SECTION("Test: change DI data..") SECTION("Test: change DI data..")
{ {
UniSetUDP::UDPPacket pack0 = receive(); UniSetUDP::UDPMessage pack0 = receive();
ui->setValue(6, 1); ui->setValue(6, 1);
REQUIRE( ui->getValue(6) == 1 ); REQUIRE( ui->getValue(6) == 1 );
msleep(120); msleep(120);
UniSetUDP::UDPPacket pack = receive( pack0.msg.header.num + 1 ); UniSetUDP::UDPMessage pack = receive( pack0.header.num + 1 );
REQUIRE( pack.msg.header.num != 0 ); REQUIRE( pack.header.num != 0 );
REQUIRE( pack.msg.asize() == 4 ); REQUIRE( pack.asize() == 4 );
REQUIRE( pack.msg.dsize() == 2 ); REQUIRE( pack.dsize() == 2 );
REQUIRE( pack.msg.dValue(0) == true ); REQUIRE( pack.dValue(0) == true );
ui->setValue(6, 0); ui->setValue(6, 0);
REQUIRE( ui->getValue(6) == 0 ); REQUIRE( ui->getValue(6) == 0 );
msleep(120); msleep(120);
UniSetUDP::UDPPacket pack2 = receive( pack.msg.header.num + 1 ); UniSetUDP::UDPMessage pack2 = receive( pack.header.num + 1 );
REQUIRE( pack2.msg.header.num != 0 ); REQUIRE( pack2.header.num != 0 );
REQUIRE( pack2.msg.header.num > pack.msg.header.num ); REQUIRE( pack2.header.num > pack.header.num );
REQUIRE( pack2.msg.asize() == 4 ); REQUIRE( pack2.asize() == 4 );
REQUIRE( pack2.msg.dsize() == 2 ); REQUIRE( pack2.dsize() == 2 );
REQUIRE( pack2.msg.dValue(0) == false ); REQUIRE( pack2.dValue(0) == false );
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -260,11 +247,11 @@ TEST_CASE("[UNetUDP]: check receiver", "[unetudp][receiver]") ...@@ -260,11 +247,11 @@ TEST_CASE("[UNetUDP]: check receiver", "[unetudp][receiver]")
{ {
REQUIRE( ui->getValue(node2_respond_s) == 0 ); REQUIRE( ui->getValue(node2_respond_s) == 0 );
UniSetUDP::UDPPacket pack; UniSetUDP::UDPMessage pack;
pack.msg.addAData(8, 100); pack.addAData(8, 100);
pack.msg.addAData(9, -100); pack.addAData(9, -100);
pack.msg.addDData(10, true); pack.addDData(10, true);
pack.msg.addDData(11, false); pack.addDData(11, false);
REQUIRE( ui->getValue(8) == 0 ); REQUIRE( ui->getValue(8) == 0 );
REQUIRE( ui->getValue(9) == 0 ); REQUIRE( ui->getValue(9) == 0 );
...@@ -284,11 +271,11 @@ TEST_CASE("[UNetUDP]: check receiver", "[unetudp][receiver]") ...@@ -284,11 +271,11 @@ TEST_CASE("[UNetUDP]: check receiver", "[unetudp][receiver]")
} }
SECTION("Test: send data pack2.") SECTION("Test: send data pack2.")
{ {
UniSetUDP::UDPPacket pack; UniSetUDP::UDPMessage pack;
pack.msg.addAData(8, 10); pack.addAData(8, 10);
pack.msg.addAData(9, -10); pack.addAData(9, -10);
pack.msg.addDData(10, false); pack.addDData(10, false);
pack.msg.addDData(11, true); pack.addDData(11, true);
send(pack); send(pack);
msleep(600); msleep(600);
REQUIRE( ui->getValue(8) == 10 ); REQUIRE( ui->getValue(8) == 10 );
...@@ -307,8 +294,8 @@ TEST_CASE("[UNetUDP]: check packets 'hole'", "[unetudp][udphole]") ...@@ -307,8 +294,8 @@ TEST_CASE("[UNetUDP]: check packets 'hole'", "[unetudp][udphole]")
InitTest(); InitTest();
// проверяем обработку "дырок" в пакетах. // проверяем обработку "дырок" в пакетах.
UniSetUDP::UDPPacket pack; UniSetUDP::UDPMessage pack;
pack.msg.addAData(8, 15); pack.addAData(8, 15);
send(pack); send(pack);
msleep(120); msleep(120);
REQUIRE( ui->getValue(8) == 15 ); REQUIRE( ui->getValue(8) == 15 );
...@@ -319,8 +306,8 @@ TEST_CASE("[UNetUDP]: check packets 'hole'", "[unetudp][udphole]") ...@@ -319,8 +306,8 @@ TEST_CASE("[UNetUDP]: check packets 'hole'", "[unetudp][udphole]")
// искусственно делаем дырку в два пакета // искусственно делаем дырку в два пакета
s_numpack = lastnum + 3; s_numpack = lastnum + 3;
UniSetUDP::UDPPacket pack_hole; UniSetUDP::UDPMessage pack_hole;
pack_hole.msg.addAData(8, 30); pack_hole.addAData(8, 30);
send(pack_hole); // пакет с дыркой send(pack_hole); // пакет с дыркой
msleep(80); msleep(80);
...@@ -328,16 +315,16 @@ TEST_CASE("[UNetUDP]: check packets 'hole'", "[unetudp][udphole]") ...@@ -328,16 +315,16 @@ TEST_CASE("[UNetUDP]: check packets 'hole'", "[unetudp][udphole]")
REQUIRE( ui->getValue(node2_lostpackets_as) == nlost ); REQUIRE( ui->getValue(node2_lostpackets_as) == nlost );
s_numpack = lastnum + 1; s_numpack = lastnum + 1;
UniSetUDP::UDPPacket pack1; UniSetUDP::UDPMessage pack1;
pack1.msg.addAData(8, 21); pack1.addAData(8, 21);
send(pack1); // заполняем первую дырку.// дырка закроется. пакет тут же обработается send(pack1); // заполняем первую дырку.// дырка закроется. пакет тут же обработается
msleep(100); msleep(100);
REQUIRE( ui->getValue(8) == 21 ); REQUIRE( ui->getValue(8) == 21 );
REQUIRE( ui->getValue(node2_lostpackets_as) == nlost ); REQUIRE( ui->getValue(node2_lostpackets_as) == nlost );
s_numpack = lastnum + 2; s_numpack = lastnum + 2;
UniSetUDP::UDPPacket pack2; UniSetUDP::UDPMessage pack2;
pack2.msg.addAData(8, 25); pack2.addAData(8, 25);
send(pack2); // заполняем следующую дырку send(pack2); // заполняем следующую дырку
msleep(120); msleep(120);
...@@ -358,8 +345,8 @@ TEST_CASE("[UNetUDP]: check packets 'MaxDifferens'", "[unetudp][maxdifferens]") ...@@ -358,8 +345,8 @@ TEST_CASE("[UNetUDP]: check packets 'MaxDifferens'", "[unetudp][maxdifferens]")
InitTest(); InitTest();
// проверяем обработку "дырок" в пакетах. // проверяем обработку "дырок" в пакетах.
UniSetUDP::UDPPacket pack; UniSetUDP::UDPMessage pack;
pack.msg.addAData(8, 50); pack.addAData(8, 50);
send(pack); send(pack);
msleep(1000); msleep(1000);
...@@ -371,8 +358,8 @@ TEST_CASE("[UNetUDP]: check packets 'MaxDifferens'", "[unetudp][maxdifferens]") ...@@ -371,8 +358,8 @@ TEST_CASE("[UNetUDP]: check packets 'MaxDifferens'", "[unetudp][maxdifferens]")
// искуственно делаем дырку в два пакета // искуственно делаем дырку в два пакета
s_numpack += maxDifferense + 1; s_numpack += maxDifferense + 1;
UniSetUDP::UDPPacket pack_hole; UniSetUDP::UDPMessage pack_hole;
pack_hole.msg.addAData(8, 150); pack_hole.addAData(8, 150);
send(pack_hole); // пакет с дыркой > maxDifference (должен обработаться) send(pack_hole); // пакет с дыркой > maxDifference (должен обработаться)
msleep(120); msleep(120);
...@@ -386,8 +373,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]") ...@@ -386,8 +373,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]")
InitTest(); InitTest();
// посылаем нормальный пакет // посылаем нормальный пакет
UniSetUDP::UDPPacket pack; UniSetUDP::UDPMessage pack;
pack.msg.addAData(8, 60); pack.addAData(8, 60);
send(pack); send(pack);
msleep(150); msleep(150);
REQUIRE( ui->getValue(8) == 60 ); REQUIRE( ui->getValue(8) == 60 );
...@@ -396,8 +383,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]") ...@@ -396,8 +383,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]")
// посылаем пакет с тем же номером // посылаем пакет с тем же номером
s_numpack = lastpack; s_numpack = lastpack;
UniSetUDP::UDPPacket pack1; UniSetUDP::UDPMessage pack1;
pack1.msg.addAData(8, 150); pack1.addAData(8, 150);
send(pack1); // должен быть "откинут" send(pack1); // должен быть "откинут"
msleep(120); msleep(120);
...@@ -405,8 +392,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]") ...@@ -405,8 +392,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]")
// посылаем пакет с меньшим номером // посылаем пакет с меньшим номером
s_numpack = lastpack - 2; s_numpack = lastpack - 2;
UniSetUDP::UDPPacket pack2; UniSetUDP::UDPMessage pack2;
pack2.msg.addAData(8, 155); pack2.addAData(8, 155);
send(pack2); // должен быть "откинут" send(pack2); // должен быть "откинут"
msleep(120); msleep(120);
...@@ -414,8 +401,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]") ...@@ -414,8 +401,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]")
// посылаем нормальный // посылаем нормальный
s_numpack = lastpack + 1; s_numpack = lastpack + 1;
UniSetUDP::UDPPacket pack3; UniSetUDP::UDPMessage pack3;
pack3.msg.addAData(8, 160); pack3.addAData(8, 160);
send(pack3); // должен быть "обработан" send(pack3); // должен быть "обработан"
msleep(120); msleep(120);
...@@ -425,8 +412,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]") ...@@ -425,8 +412,8 @@ TEST_CASE("[UNetUDP]: bad packet number", "[unetudp][badnumber]")
TEST_CASE("[UNetUDP]: switching channels", "[unetudp][chswitch]") TEST_CASE("[UNetUDP]: switching channels", "[unetudp][chswitch]")
{ {
InitTest(); InitTest();
UniSetUDP::UDPPacket pack; UniSetUDP::UDPMessage pack;
pack.msg.addAData(8, 70); pack.addAData(8, 70);
send(pack); send(pack);
msleep(120); msleep(120);
REQUIRE( ui->getValue(8) == 70 ); REQUIRE( ui->getValue(8) == 70 );
...@@ -450,38 +437,38 @@ TEST_CASE("[UNetUDP]: check undefined value", "[unetudp][sender]") ...@@ -450,38 +437,38 @@ TEST_CASE("[UNetUDP]: check undefined value", "[unetudp][sender]")
{ {
InitTest(); InitTest();
UniSetUDP::UDPPacket pack0 = receive(); UniSetUDP::UDPMessage pack0 = receive();
ui->setValue(2, 110); ui->setValue(2, 110);
REQUIRE( ui->getValue(2) == 110 ); REQUIRE( ui->getValue(2) == 110 );
msleep(600); msleep(600);
UniSetUDP::UDPPacket pack = receive( pack0.msg.header.num + 1, 2000, 40 ); UniSetUDP::UDPMessage pack = receive( pack0.header.num + 1, 2000, 40 );
REQUIRE( pack.msg.header.num != 0 ); REQUIRE( pack.header.num != 0 );
REQUIRE( pack.msg.asize() == 4 ); REQUIRE( pack.asize() == 4 );
REQUIRE( pack.msg.dsize() == 2 ); REQUIRE( pack.dsize() == 2 );
REQUIRE( pack.msg.a_dat[0].val == 110 ); REQUIRE( pack.a_dat[0].val == 110 );
IOController_i::SensorInfo si; IOController_i::SensorInfo si;
si.id = 2; si.id = 2;
si.node = uniset_conf()->getLocalNode(); si.node = uniset_conf()->getLocalNode();
ui->setUndefinedState(si, true, 6000 /* TestProc */ ); ui->setUndefinedState(si, true, 6000 /* TestProc */ );
msleep(600); msleep(600);
pack = receive(pack.msg.header.num + 1); pack = receive(pack.header.num + 1);
REQUIRE( pack.msg.header.num != 0 ); REQUIRE( pack.header.num != 0 );
REQUIRE( pack.msg.asize() == 4 ); REQUIRE( pack.asize() == 4 );
REQUIRE( pack.msg.dsize() == 2 ); REQUIRE( pack.dsize() == 2 );
REQUIRE( pack.msg.a_dat[0].val == 65635 ); REQUIRE( pack.a_dat[0].val == 65635 );
ui->setUndefinedState(si, false, 6000 /* TestProc */ ); ui->setUndefinedState(si, false, 6000 /* TestProc */ );
msleep(600); msleep(600);
pack = receive(pack.msg.header.num + 1); pack = receive(pack.header.num + 1);
REQUIRE( pack.msg.header.num != 0 ); REQUIRE( pack.header.num != 0 );
REQUIRE( pack.msg.asize() == 4 ); REQUIRE( pack.asize() == 4 );
REQUIRE( pack.msg.dsize() == 2 ); REQUIRE( pack.dsize() == 2 );
REQUIRE( pack.msg.a_dat[0].val == 110 ); REQUIRE( pack.a_dat[0].val == 110 );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -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::UDPPacket mypack; UniSetUDP::UDPMessage mypack;
mypack.msg.header.nodeID = 100; mypack.header.nodeID = 100;
mypack.msg.header.procID = 100; mypack.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.msg.addAData(d); mypack.addAData(d);
} }
for( size_t i = 0; i < count; i++ ) for( size_t i = 0; i < count; i++ )
mypack.msg.addDData(i, i); mypack.addDData(i, i);
for( size_t i = 0; i < max; i++ ) for( size_t i = 0; i < max; i++ )
{ {
...@@ -96,7 +96,7 @@ static void run_senders( size_t max, const std::string& s_host, size_t count = 5 ...@@ -96,7 +96,7 @@ static void run_senders( size_t max, const std::string& s_host, size_t count = 5
while( nc ) // -V654 while( nc ) // -V654
{ {
mypack.msg.header.num = packetnum++; mypack.header.num = packetnum++;
// при переходе черех максимум (UniSetUDP::MaxPacketNum) // при переходе черех максимум (UniSetUDP::MaxPacketNum)
// пакет опять должен иметь номер "1" // пакет опять должен иметь номер "1"
...@@ -109,10 +109,10 @@ static void run_senders( size_t max, const std::string& s_host, size_t count = 5 ...@@ -109,10 +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) )
{ {
size_t ret = udp->sendBytes(mypack.raw, mypack.msg.len()); size_t ret = udp->sendBytes(&mypack, sizeof(mypack));
if( ret < mypack.msg.len() ) if( ret < sizeof(mypack) )
cerr << "(send): FAILED ret=" << ret << " < sizeof=" << mypack.msg.len() << endl; cerr << "(send): FAILED ret=" << ret << " < sizeof=" << sizeof(mypack) << endl;
} }
} }
catch( Poco::Net::NetException& e ) catch( Poco::Net::NetException& e )
...@@ -140,7 +140,7 @@ static void run_test( size_t max, const std::string& host ) ...@@ -140,7 +140,7 @@ static void run_test( size_t max, const std::string& host )
{ {
cout << "create receiver: " << host << ":" << begPort + i << endl; cout << "create receiver: " << host << ":" << begPort + i << endl;
auto r = make_shared<UNetReceiver>(host, begPort + i, smiInstance()); auto r = make_shared<UNetReceiver>(host, begPort + i, smiInstance());
//r->setLockUpdate(true); r->setLockUpdate(true);
vrecv.emplace_back(r); vrecv.emplace_back(r);
} }
...@@ -177,9 +177,9 @@ int main(int argc, char* argv[] ) ...@@ -177,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(10, host); run_senders(1, host);
else else
run_test(10, host); run_test(1, host);
return 0; return 0;
} }
......
...@@ -223,7 +223,7 @@ int main(int argc, char* argv[]) ...@@ -223,7 +223,7 @@ int main(int argc, char* argv[])
{ {
UDPReceiveU udp(s_host, port); UDPReceiveU udp(s_host, port);
UniSetUDP::UDPPacket pack; UniSetUDP::UDPMessage pack;
unsigned long prev_num = 1; unsigned long prev_num = 1;
int nc = 1; int nc = 1;
...@@ -255,7 +255,7 @@ int main(int argc, char* argv[]) ...@@ -255,7 +255,7 @@ int main(int argc, char* argv[])
continue; continue;
} }
size_t ret = udp.receiveBytes(pack.raw, sizeof(pack.raw) ); size_t ret = udp.receiveBytes(&pack, sizeof(pack) );
if( ret < 0 ) if( ret < 0 )
{ {
...@@ -269,9 +269,9 @@ int main(int argc, char* argv[]) ...@@ -269,9 +269,9 @@ int main(int argc, char* argv[])
continue; continue;
} }
pack.msg.ntoh(); pack.ntoh();
if( pack.msg.header.magic != UniSetUDP::UNETUDP_MAGICNUM ) if( pack.header.magic != UniSetUDP::UNETUDP_MAGICNUM )
{ {
cerr << "(recv): BAD PROTOCOL VERSION! [ need version '" << UniSetUDP::UNETUDP_MAGICNUM << "']" << endl; cerr << "(recv): BAD PROTOCOL VERSION! [ need version '" << UniSetUDP::UNETUDP_MAGICNUM << "']" << endl;
continue; continue;
...@@ -279,11 +279,11 @@ int main(int argc, char* argv[]) ...@@ -279,11 +279,11 @@ int main(int argc, char* argv[])
if( lost ) if( lost )
{ {
if( prev_num != (pack.msg.header.num - 1) ) if( prev_num != (pack.header.num - 1) )
cerr << "WARNING! Incorrect sequence of packets! current=" << pack.msg.header.num cerr << "WARNING! Incorrect sequence of packets! current=" << pack.header.num
<< " prev=" << prev_num << endl; << " prev=" << prev_num << endl;
prev_num = pack.msg.header.num; prev_num = pack.header.num;
} }
npack++; npack++;
...@@ -293,7 +293,7 @@ int main(int argc, char* argv[]) ...@@ -293,7 +293,7 @@ int main(int argc, char* argv[])
<< " bytes: " << ret << endl; << " bytes: " << ret << endl;
if( show ) if( show )
cout << "receive data: " << pack.msg << endl; cout << "receive data: " << pack << endl;
} }
catch( Poco::Net::NetException& e ) catch( Poco::Net::NetException& e )
{ {
...@@ -320,10 +320,9 @@ int main(int argc, char* argv[]) ...@@ -320,10 +320,9 @@ 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::UDPPacket mypack; UniSetUDP::UDPMessage mypack;
UDPMessage* msg = &mypack.msg; mypack.header.nodeID = nodeID;
msg->header.nodeID = nodeID; mypack.header.procID = procID;
msg->header.procID = procID;
if( !a_data.empty() ) if( !a_data.empty() )
{ {
...@@ -332,7 +331,7 @@ int main(int argc, char* argv[]) ...@@ -332,7 +331,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);
msg->addAData(d); mypack.addAData(d);
} }
} }
else else
...@@ -340,7 +339,7 @@ int main(int argc, char* argv[]) ...@@ -340,7 +339,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);
msg->addAData(d); mypack.addAData(d);
} }
} }
...@@ -349,12 +348,12 @@ int main(int argc, char* argv[]) ...@@ -349,12 +348,12 @@ 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 )
msg->addDData(v.si.id, v.val); mypack.addDData(v.si.id, v.val);
} }
else else
{ {
for( size_t i = 0; i < count; i++ ) for( size_t i = 0; i < count; i++ )
msg->addDData(i, i); mypack.addDData(i, i);
} }
Poco::Net::SocketAddress sa(s_host, port); Poco::Net::SocketAddress sa(s_host, port);
...@@ -367,7 +366,7 @@ int main(int argc, char* argv[]) ...@@ -367,7 +366,7 @@ int main(int argc, char* argv[])
while( nc ) while( nc )
{ {
msg->header.num = packetnum++; mypack.header.num = packetnum++;
// при переходе через максимум (UniSetUDP::MaxPacketNum) // при переходе через максимум (UniSetUDP::MaxPacketNum)
// пакет опять должен иметь номер "1" // пакет опять должен иметь номер "1"
...@@ -379,13 +378,13 @@ int main(int argc, char* argv[]) ...@@ -379,13 +378,13 @@ 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) )
{ {
if( verb ) if( verb )
cout << "(send): to addr=" << addr << " d_count=" << msg->header.dcount cout << "(send): to addr=" << addr << " d_count=" << mypack.header.dcount
<< " a_count=" << msg->header.acount << " bytes=" << msg->len() << endl; << " a_count=" << mypack.header.acount << endl;
size_t ret = udp->sendBytes(mypack.raw, sizeof(mypack.raw) /* mypack.msg.len() */); size_t ret = udp->sendBytes(&mypack, sizeof(mypack) );
if( ret < msg->len() ) if( ret < sizeof(mypack) )
cerr << "(send): FAILED ret=" << ret << " < sizeof=" << msg->len() << endl; cerr << "(send): FAILED ret=" << ret << " < sizeof=" << sizeof(mypack) << endl;
} }
} }
catch( Poco::Net::NetException& e ) catch( Poco::Net::NetException& e )
......
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