SIGSEGV bei TCP Socket
Verfasst: 25. September 2015 08:05
Hi,
ich arbeite gerade an einer kleinen Qt-App für Android, wo Daten über W-LAN von einem anderen Gerät empfangen werden sollen. Diese Daten werden dann zyklich (alle 50ms) von einem Programmteil "abgeholt". Hierfür habe ich eine Socket-Klasse geschrieben:
Falls die Verbindung getrennt wird, wird so alle 5 Sekunden probiert, sie wieder herzustellen. Wenn das "connected"-Signal kommt, wird der Timer wieder ausgeschaltet:
Hier werden die Daten (über Umwege) vom Socket in eine Queue gelesen:
und so später vom Prozess wieder ausgelesen:
Das ganze geht auch einige Zeit gut, dann kommt es aber zum Segmentation fault. Der tritt auch nicht immer an der gleichen Stelle auf, sondern mal hier:
oder hier
oder hier
Mir ist allerdings (mangels fehlender Erfahrung) nicht klar, warum er manchmal nicht auf den TCP Socket zugreifen kann. Was ich im Debugger sehe, ist, dass häufig kleine Pakete ankommen (<100 Bytes), sich dann die Schnittstelle wohl verschluckt (WLan-Signal ist nicht besonders gut), und dann plötzlich gerne mal mehr als 2000 bytes kommen.
Habt Ihr da einen Tip für mich? Muss ich das noch irgendwie mit Semaphoren schützen? Oder weitere Abfragen machen??? Bin da langsam echt ratlos...
Vielen Dank im Voraus,
Ozzy
ich arbeite gerade an einer kleinen Qt-App für Android, wo Daten über W-LAN von einem anderen Gerät empfangen werden sollen. Diese Daten werden dann zyklich (alle 50ms) von einem Programmteil "abgeholt". Hierfür habe ich eine Socket-Klasse geschrieben:
Code: Alles auswählen
TCPSocket::TCPSocket(QObject *parent) :
QObject(parent)
{
reconnectTimer = new QTimer(this);
m_tcpSocket = new QTcpSocket(this);
connect(this, SIGNAL(startTimer()), this, SLOT(startTimerSlot()));
connect(this, SIGNAL(stopTimer()), this, SLOT(stopTimerSlot()));
connect(reconnectTimer, SIGNAL(timeout()), this, SLOT(reconnectTimerSlot()));
reconnectTimer->setInterval(5000);
connectServer();
}
void TCPSocket::connectServer()
{
if (!reconnectTimer->isActive())
{
emit startTimer();
}
m_tcpSocket->abort();
m_tcpSocket->connectToHost(IP, PORT);
connect(m_tcpSocket, SIGNAL(readyRead()), this, SLOT(readMesg()));
connect(m_tcpSocket, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
connect(m_tcpSocket, SIGNAL(connected()), this, SLOT(onConnected()));
}
Falls die Verbindung getrennt wird, wird so alle 5 Sekunden probiert, sie wieder herzustellen. Wenn das "connected"-Signal kommt, wird der Timer wieder ausgeschaltet:
Code: Alles auswählen
void TCPSocket::onConnected()
{
#ifdef DEBUG
qDebug() << QTime::currentTime().toString() << "TCPSocket: Connected... ";
#endif
bIsConnected = true;
emit stopTimer();
}
Code: Alles auswählen
void TCPSocket::readMesg() //read msg
{
if(bIsConnected)
{
try
{
qDebug() << "Read: " << m_tcpSocket->bytesAvailable();
QByteArray qba = m_tcpSocket->readAll();
for (int i=0; i<qba.length(); i++)
{
queue.enqueue(qba[i]);
}
}
catch (std::exception &e)
{
qDebug() << "Exception: " << e.what();
}
}
}
Code: Alles auswählen
int TCPSocket::receiveData( U_BYTE_8 *receivedData )
{
int i=0;
qDebug() << queue.size();
while (!queue.isEmpty())
{
receivedData[i] = queue.dequeue();
i++;
}
qDebug() << "finished.";
return i;
}
Code: Alles auswählen
qDebug() << "Read: " << m_tcpSocket->bytesAvailable();Code: Alles auswählen
QByteArray qba = m_tcpSocket->readAll();Code: Alles auswählen
m_tcpSocket->write(buffer);Habt Ihr da einen Tip für mich? Muss ich das noch irgendwie mit Semaphoren schützen? Oder weitere Abfragen machen??? Bin da langsam echt ratlos...
Vielen Dank im Voraus,
Ozzy