1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-02-03 09:44:01 -05: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_remoteAddress(QHostAddress::LocalHost),
m_dataPort(9999),
m_remotePort(0),
m_dataConnected(false),
m_udpReadBytes(0),
m_udpDumpIndex(0),
m_nbUDPFrames(m_minNbUDPFrames),
m_nbAllocatedUDPFrames(m_minNbUDPFrames),
m_writeIndex(0),
@ -93,18 +94,37 @@ void UDPSinkUDPHandler::dataReadyRead()
while (m_dataSocket->hasPendingDatagrams() && m_dataConnected)
{
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) {
moveData();
m_udpReadBytes = 0;
if (bytesRead < 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) {
m_writeIndex++;

View File

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