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:
parent
38000f3305
commit
130759fba7
@ -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++;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user