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