Commit 88fd1767 authored by Pavel Vainerman's avatar Pavel Vainerman

(UNetUDP): добавил в отладочную информацию, вывод

списка сформированных пакетов с указанием их размера, а также подправил вывод статистики по количеству обработанных и принятых пакетов.
parent a5b03d54
......@@ -265,6 +265,15 @@ long UDPMessage::getDataID() const
// если нет данных(?) просто возвращаем номер пакета
return num;
}
size_t UniSetUDP::UDPMessage::sizeOf() const
{
// биты которые не уместились в очередной байт, добавляют ещё один байт
size_t nbit = dcount % 8 * sizeof(unsigned char);
size_t add = nbit > 0 ? 1 : 0;
return sizeof(UDPHeader) + acount * sizeof(UDPAData) + dcount * sizeof(long) + (dcount / 8 * sizeof(unsigned char) + add);
}
// -----------------------------------------------------------------------------
UDPMessage::UDPMessage( UDPPacket& p )
{
......
......@@ -67,11 +67,12 @@ namespace UniSetUDP
friend std::ostream& operator<<( std::ostream& os, UDPAData& p );
} __attribute__((packed));
// Хотелось бы не вылезать за общий размер посылаемых пакетов 8192. (550,900 --> 8133)
// ------
// временное резрешение на A=800,D=5000! DI/DO
// 1500*8 + 5000*4 + 5000/8 = 32625 байт максимальный размер данных + служебные заголовки
// Теоретический размер данных в UDP пакете (исключая заголовки) 65507
// Фактически желательно не вылезать за размер MTU (обычно 1500) - заголовки = 1432 байта
// т.е. надо чтобы sizeof(UDPPacket) < 1432
// При текущих настройках sizeof(UDPPacket) = 32654 (!)
static const size_t MaxACount = 1500;
static const size_t MaxDCount = 5000;
static const size_t MaxDDataCount = 1 + MaxDCount / 8 * sizeof(unsigned char);
......@@ -128,6 +129,9 @@ namespace UniSetUDP
return acount;
}
// размер итогового пакета в байтах
size_t sizeOf() const;
uint16_t getDataCRC() const;
// количество байт в пакете с булевыми переменными...
......
......@@ -281,10 +281,13 @@ void UNetReceiver::statisticsEvent(ev::periodic& tm, int revents)
return;
}
unetlog9 << myname << "(statisctics):"
<< " recvCount=" << recvCount << "[per sec]"
<< " upCount=" << upCount << "[per sec]"
<< endl;
statRecvPerSec = recvCount;
statUpPerSec = upCount;
// unetlog9 << myname << "(statisctics):"
// << " recvCount=" << recvCount << "[per sec]"
// << " upCount=" << upCount << "[per sec]"
// << endl;
recvCount = 0;
upCount = 0;
......@@ -872,7 +875,7 @@ const std::string UNetReceiver::getShortInfo() const
<< " waitClean=" << waitClean
<< " ]"
<< endl
<< "\t[ recvCount=" << recvCount << " upCount=" << upCount << " per sec ]";
<< "\t[ recv=" << statRecvPerSec << " update=" << statUpPerSec << " per sec ]";
return std::move(s.str());
}
......
......@@ -214,9 +214,14 @@ class UNetReceiver:
ev::periodic evCheckConnection;
ev::periodic evStatistic;
// счётчики для подсчёта статистики
size_t recvCount = { 0 };
size_t upCount = { 0 };
// текущая статистик
size_t statRecvPerSec = { 0 }; /*!< количество принимаемых пакетов в секунду */
size_t statUpPerSec = { 0 }; /*!< количество обработанных пакетов в секунду */
std::shared_ptr< ThreadCreator<UNetReceiver> > upThread; // update thread
// делаем loop общим.. одним на всех!
......
......@@ -542,7 +542,16 @@ const std::string UNetSender::getShortInfo() const
<< endl;
for( auto i = mypacks.begin(); i != mypacks.end(); ++i )
s << " \t\t[" << i->first << "]=" << i->second.size() << endl;
{
s << " \t[" << i->first << "]=" << i->second.size() << endl;
size_t n=0;
for( const auto& p: i->second )
{
s << " \t\t[" << (n++) << "]=" << p.sizeOf() << " bytes"
<< " ( numA=" << setw(5) << p.asize() << " numD=" << setw(5) << p.dsize() << ")"
<< endl;
}
}
return std::move(s.str());
}
......
......@@ -179,6 +179,21 @@ TEST_CASE("[UNetUDP]: UDPMessage", "[unetudp][udpmessage]")
}
}
// -----------------------------------------------------------------------------
TEST_CASE("[UNetUDP]: sizeOf", "[unetudp][sizeof]")
{
UniSetUDP::UDPMessage m;
REQUIRE( m.sizeOf() == sizeof(UniSetUDP::UDPHeader) );
m.addAData(8, 70);
REQUIRE( m.sizeOf() == sizeof(UniSetUDP::UDPHeader)+sizeof(UniSetUDP::UDPAData) );
UniSetUDP::UDPPacket p;
size_t len = m.transport_msg(p);
REQUIRE( len == m.sizeOf() );
}
// -----------------------------------------------------------------------------
TEST_CASE("[UNetUDP]: respond sensor", "[unetudp]")
{
InitTest();
......
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