Я замечаю странное поведение при расширении QThread для реализации соединения Tcp. Это моя функция запуска:
void mySocket::run()
{
socketLocal = new QTcpSocket();
connect(socketLocal, SIGNAL(connected()), this, SLOT(connected()));
connect(socketLocal, SIGNAL(disconnected()), this, SLOT(disconnected()));
connect(socketLocal, SIGNAL(bytesWritten(qint64)), this, SLOT(bytesWritten(qint64)));
connect(socketLocal, SIGNAL(readyRead()), this, SLOT(readyRead()));
QString serverName = this->myAddress;
quint16 serverPort = this->myPort;
quit = false;
while(!quit)
{
qDebug() << "Connecting to: " << serverName;
socketLocal->connectToHost(serverName, serverPort);
if(!socketLocal->waitForConnected(1000))
{
qDebug() << "Socket Error: " << socketLocal->errorString();
sleep(1);
}
else
{
exec();
}
}
}
void mySocket::sendMsg()
{
// build msgToWrite
byteWrite = socketLocal->write(QByteArray(msgToWrite, sizeOfMsg));
socketLocal->waitForBytesWritten(50);
}
void mySocket::connected()
{
qDebug() << "connected...";
timerKA->start(2000);
}
void mySocket::disconnected()
{
timerKA->stop();
if(this->controlledDisconnection)
quit = true;
exit();
}
флаг «quit» сообщает мне, действительно ли я хочу закрыть соединение с сокетом или хочу восстановить соединение. При появлении подключенного сигнала я запускаю QTimer, который каждые 2 секунды отправляет сообщение KeepAlive в мой сокет с помощью функции sendMsg. При отключении я останавливаю таймер и вызываю «exit ()», чтобы вернуть «exe c ()». В bytesWritten и readyRead я печатаю только отправленные / полученные байты. Что ж, этот код, работающий на встроенном Linux, вызывает segfault, если я подключаюсь к реальной встроенной машине Linux, но если я подключаюсь к виртуальной машине с таким же встроенным Linux, все работает нормально. Если я запустил этот код на машине Windows, все снова будет работать нормально. Это segfault:
*** Error in `./mySocketTest': malloc(): memory corruption: 0x00007fd5200019b0 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x7404e)[0x7fd538dfc04e]
/lib64/libc.so.6(+0x7994e)[0x7fd538e0194e]
/lib64/libc.so.6(+0x7b11f)[0x7fd538e0311f]
/lib64/libc.so.6(__libc_malloc+0x60)[0x7fd538e05180]
/lib64/libc.so.6(__backtrace_symbols+0x123)[0x7fd538e7e263]
./mySocketTest[0x433b06]
/lib64/libc.so.6(+0x33eb0)[0x7fd538dbbeb0]
/lib64/libc.so.6(+0x1321e7)[0x7fd538eba1e7]
/opt/crosstool/QtEmbedded-x86_64/lib/libQtCore.so.4(_ZN20QEventDispatcherUNIX23activateSocketNotifiersEv+0x6d)[0x7fd539f1099d]
/opt/crosstool/QtEmbedded-x86_64/lib/libQtCore.so.4(_ZN27QEventDispatcherUNIXPrivate8doSelectE6QFlagsIN10QEventLoop17ProcessEventsFlagEEP7timeval+0x4c4)[0x7fd539f10f24]
/opt/crosstool/QtEmbedded-x86_64/lib/libQtCore.so.4(_ZN20QEventDispatcherUNIX13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE+0xb3)[0x7fd539f11273]
/opt/crosstool/QtEmbedded-x86_64/lib/libQtCore.so.4(_ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEE+0x31)[0x7fd539ee27c1]
/opt/crosstool/QtEmbedded-x86_64/lib/libQtCore.so.4(_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE+0x185)[0x7fd539ee2ad5]
/opt/crosstool/QtEmbedded-x86_64/lib/libQtCore.so.4(_ZN7QThread4execEv+0xe9)[0x7fd539ddc489]
Я что-то упустил? Я что-то делаю не так?
Всем спасибо.