1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-09-03 21:57:51 -04:00

UDP sink plugin: foolproof UDP reception

This commit is contained in:
f4exb 2017-08-18 12:31:17 +02:00
parent 38000f3305
commit 130759fba7
2 changed files with 31 additions and 10 deletions

View File

@ -25,8 +25,9 @@ UDPSinkUDPHandler::UDPSinkUDPHandler() :
m_dataAddress(QHostAddress::LocalHost), m_dataAddress(QHostAddress::LocalHost),
m_remoteAddress(QHostAddress::LocalHost), m_remoteAddress(QHostAddress::LocalHost),
m_dataPort(9999), m_dataPort(9999),
m_remotePort(0),
m_dataConnected(false), m_dataConnected(false),
m_udpReadBytes(0), m_udpDumpIndex(0),
m_nbUDPFrames(m_minNbUDPFrames), m_nbUDPFrames(m_minNbUDPFrames),
m_nbAllocatedUDPFrames(m_minNbUDPFrames), m_nbAllocatedUDPFrames(m_minNbUDPFrames),
m_writeIndex(0), m_writeIndex(0),
@ -93,18 +94,37 @@ void UDPSinkUDPHandler::dataReadyRead()
while (m_dataSocket->hasPendingDatagrams() && m_dataConnected) while (m_dataSocket->hasPendingDatagrams() && m_dataConnected)
{ {
qint64 pendingDataSize = m_dataSocket->pendingDatagramSize(); qint64 pendingDataSize = m_dataSocket->pendingDatagramSize();
m_udpReadBytes += m_dataSocket->readDatagram(&m_udpTmpBuf[m_udpReadBytes], pendingDataSize, &m_remoteAddress, 0); qint64 bytesRead = m_dataSocket->readDatagram(&m_udpDump[m_udpDumpIndex], pendingDataSize, &m_remoteAddress, &m_remotePort);
if (m_udpReadBytes == m_udpBlockSize) { if (bytesRead < 0)
moveData(); {
m_udpReadBytes = 0; qWarning("UDPSinkUDPHandler::dataReadyRead: UDP read error");
}
else
{
int udpDumpSize = m_udpDumpIndex + bytesRead;
int udpDumpPtr = 0;
while (udpDumpSize >= m_udpBlockSize)
{
moveData(&m_udpDump[udpDumpPtr]);
udpDumpPtr += m_udpBlockSize;
udpDumpSize -= m_udpBlockSize;
}
if (udpDumpSize > 0)
{
memcpy(m_udpDump, &m_udpDump[udpDumpPtr], udpDumpSize);
}
m_udpDumpIndex = udpDumpSize;
} }
} }
} }
void UDPSinkUDPHandler::moveData() void UDPSinkUDPHandler::moveData(char *blk)
{ {
memcpy(m_udpBuf[m_writeIndex], m_udpTmpBuf, m_udpBlockSize); memcpy(m_udpBuf[m_writeIndex], blk, m_udpBlockSize);
if (m_writeIndex < m_nbUDPFrames - 1) { if (m_writeIndex < m_nbUDPFrames - 1) {
m_writeIndex++; m_writeIndex++;

View File

@ -63,17 +63,18 @@ public slots:
private: private:
typedef char (udpBlk_t)[m_udpBlockSize]; typedef char (udpBlk_t)[m_udpBlockSize];
void moveData(); void moveData(char *blk);
void advanceReadPointer(int nbBytes); void advanceReadPointer(int nbBytes);
QUdpSocket *m_dataSocket; QUdpSocket *m_dataSocket;
QHostAddress m_dataAddress; QHostAddress m_dataAddress;
QHostAddress m_remoteAddress; QHostAddress m_remoteAddress;
quint16 m_dataPort; quint16 m_dataPort;
quint16 m_remotePort;
bool m_dataConnected; bool m_dataConnected;
udpBlk_t m_udpTmpBuf;
qint64 m_udpReadBytes;
udpBlk_t *m_udpBuf; udpBlk_t *m_udpBuf;
char m_udpDump[m_udpBlockSize + 8192]; // UDP block size + largest possible block
int m_udpDumpIndex;
int m_nbUDPFrames; int m_nbUDPFrames;
int m_nbAllocatedUDPFrames; int m_nbAllocatedUDPFrames;
int m_writeIndex; int m_writeIndex;