Commit 754af958 authored by Pavel Vainerman's avatar Pavel Vainerman

UNet2: Отладил механизм защиты от сбоя счётчика пакетов.

parent 2848aa52
...@@ -19,7 +19,7 @@ namespace UniSetUDP ...@@ -19,7 +19,7 @@ namespace UniSetUDP
friend std::ostream& operator<<( std::ostream& os, UDPHeader& p ); friend std::ostream& operator<<( std::ostream& os, UDPHeader& p );
}__attribute__((packed)); }__attribute__((packed));
// static unsigned long MaxPacketNum = 50; // std::numeric_limits<unsigned long>::max(); static unsigned long MaxPacketNum = std::numeric_limits<unsigned long>::max();
struct UDPData struct UDPData
{ {
......
...@@ -152,13 +152,33 @@ void UNetReceiver::real_update() ...@@ -152,13 +152,33 @@ void UNetReceiver::real_update()
return; return;
p = qpack.top(); p = qpack.top();
unsigned long sub = labs(p.msg.header.num - pnum);
if( pnum > 0 && labs(p.msg.header.num - pnum) > 1 ) if( pnum > 0 )
{ {
if( !ptLostTimeout.checkTime() ) // если sub > maxDifferens
return; // значит это просто "разрыв"
// и нам ждать lostTimeout не надо
// сразу начинаем обрабатывать новые пакеты
// а если > 1 && < maxDifferens
// значит это временная "дырка"
// и надо подождать lostTimeout
// чтобы констатировать потерю пакета..
if( sub > 1 && sub < maxDifferens )
{
if( !ptLostTimeout.checkTime() )
return;
lostPackets++; lostPackets++;
}
else if( p.msg.header.num == pnum )
{
/* а что делать если идут повторные пакеты ?!
* для надёжности лучше обрабатывать..
* для "оптимизации".. лучше игнорировать
*/
qpack.pop(); // пока выбрали вариант "оптимизации"
continue;
}
} }
ptLostTimeout.reset(); ptLostTimeout.reset();
...@@ -171,6 +191,8 @@ void UNetReceiver::real_update() ...@@ -171,6 +191,8 @@ void UNetReceiver::real_update()
k--; k--;
// cerr << myname << "(update): " << p.msg.header << endl;
initCache(p, !cache_init_ok); initCache(p, !cache_init_ok);
for( size_t i=0; i<p.msg.header.dcount; i++ ) for( size_t i=0; i<p.msg.header.dcount; i++ )
...@@ -261,11 +283,32 @@ bool UNetReceiver::recv() ...@@ -261,11 +283,32 @@ bool UNetReceiver::recv()
return false; return false;
} }
// cerr << myname << "(receive): recv DATA OK. ret=" << ret << " sizeof=" << sz
// << " header: " << pack.msg.header << endl;
if( rnum>0 && labs(pack.msg.header.num - rnum) > maxDifferens ) if( rnum>0 && labs(pack.msg.header.num - rnum) > maxDifferens )
{
/* А что делать если мы уже ждём и ещё не "разгребли предыдущее".. а тут уже повторный "разрыв"
* Можно откинуть всё.. что сложили во временную очередь и заново "копить" (но тогда теряем информацию)
* А можно породолжать складывать во временную, но тогда есть риск "никогда" не разгрести временную
* очередь, при "частых обрывах". Потому-что update будет на каждом разрыве ждать ещё lostTimeout..
*/
// Пока выбираю.. чистить qtmp. Это будет соотвествовать логике работы с картами у которых ограничен буфер приёма.
// Обычно "кольцевой". Т.е. если не успели обработать и "вынуть" из буфера информацию.. он будет переписан новыми данными
if( waitClean )
{
dlog[Debug::CRIT] << myname << "(receive): reset qtmp.." << endl;
while( !qtmp.empty() )
qtmp.pop();
}
waitClean = true; waitClean = true;
}
rnum = pack.msg.header.num;
// cerr << myname << "(receive): recv DATA OK. ret=" << ret << " sizeof=" << sz
// << " header: " << pack.msg.header
// << " waitClean=" << waitClean
// << endl;
{ // lock qpack { // lock qpack
uniset_mutex_lock l(packMutex,500); uniset_mutex_lock l(packMutex,500);
...@@ -276,9 +319,15 @@ bool UNetReceiver::recv() ...@@ -276,9 +319,15 @@ bool UNetReceiver::recv()
} }
if( !qpack.empty() ) if( !qpack.empty() )
{
// cerr << myname << "(receive): copy to qtmp..."
// << " header: " << pack.msg.header
// << endl;
qtmp.push(pack); qtmp.push(pack);
}
else else
{ {
// cerr << myname << "(receive): copy from qtmp..." << endl;
// очередь освободилась.. // очередь освободилась..
// то копируем в неё всё что набралось... // то копируем в неё всё что набралось...
while( !qtmp.empty() ) while( !qtmp.empty() )
...@@ -286,6 +335,9 @@ bool UNetReceiver::recv() ...@@ -286,6 +335,9 @@ bool UNetReceiver::recv()
qpack.push(qtmp.top()); qpack.push(qtmp.top());
qtmp.pop(); qtmp.pop();
} }
// не забываем и текущий поместить в очередь..
qpack.push(pack);
waitClean = false; waitClean = false;
} }
} // unlock qpack } // unlock qpack
......
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
uniset-start.sh -f ./uniset-unetexchange --unet-name UNetExchange \ uniset-start.sh -f ./uniset-unetexchange --unet-name UNetExchange \
--confile test.xml \ --confile test.xml \
--unet-filter-field rs --unet-filter-value 2 \ --unet-filter-field rs --unet-filter-value 2 --unet-maxdifferense 40 \
--dlog-add-levels info,crit,warn --dlog-add-levels info,crit,warn
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