Программы на C++. Форум разработчиков
Anonymous
TCP Connect Fake после перезапуска приложения [закрыто]
Сообщение
Anonymous » 03 сен 2025, 04:27
У меня есть набор из трех потоков, скажем, a, b, c. < /p>
Поток A создает данные и отправляет адрес в потоку B через сигнал QT и слоты. Б.
Код: Выделить всё
void SCANSAVER::onReadyRead()
{
QByteArray data = socket->readAll();
controlBuffer.append(data);
// Process control messages line by line (terminated by '\n')
int newlineIndex;
while ((newlineIndex = controlBuffer.indexOf('\n')) >= 0) {
QByteArray line = controlBuffer.left(newlineIndex);
controlBuffer.remove(0, newlineIndex + 1);
QString str = QString::fromUtf8(line).trimmed();
if (str.startsWith("PATH:")) {
QStringList parts = str.split(';');
for (const QString &part : parts) {
if (part.startsWith("PATH:")) {
m_basePath = part.mid(5).trimmed();
qDebug() state() == QAbstractSocket::ConnectedState) {
socket->disconnectFromHost();
if (socket->state() != QAbstractSocket::UnconnectedState) {
bool disconnected = socket->waitForDisconnected(3000); // Increased timeout
if (!disconnected) {
socket->abort(); // Force close if graceful disconnect fails
}
}
} else if (socket->state() != QAbstractSocket::UnconnectedState) {
socket->abort(); // Force close for any non-disconnected state
}
socket->close();
socket->deleteLater();
socket = nullptr;
}
if (server) {
server->close();
server->deleteLater();
server = nullptr;
}
}
Thread B code
PROCESSFRAME::PROCESSFRAME(QObject *parent)
: QThread{parent}, image(3072, line_in_projection, QImage::Format_Grayscale16), currentLine(0)
{
socket = new QTcpSocket(this);
retryTimer = new QTimer(this);
retryTimer->setInterval(500); // retry every 500 ms
retryTimer->setSingleShot(true);
connect(socket, &QTcpSocket::connected, [](){
qDebug() state() == QAbstractSocket::ConnectedState ||
socket->state() == QAbstractSocket::ConnectingState)
return; // already connected or connecting
socket->abort(); // cancel any previous attempt
socket->connectToHost(QHostAddress::LocalHost, 12345);
if (!socket->waitForConnected(100)) { // non-blocking short wait
qWarning() start();
}
}
void PROCESSFRAME::SendSavePath(QString path, int dualEnergy)
{
if (socket->state() == QAbstractSocket::ConnectedState) {
QByteArray msg = "PATH:" + path.toUtf8() + ";DUAL:" + QByteArray::number(dualEnergy) + "\n";
socket->write(msg);
socket->flush();
qDebug() write(msg);
socket->flush();
qDebug()
Подробнее здесь: [url]https://stackoverflow.com/questions/79754019/tcp-connect-failing-after-restarting-application[/url]
1756862850
Anonymous
У меня есть набор из трех потоков, скажем, a, b, c. < /p> Поток A создает данные и отправляет адрес в потоку B через сигнал QT и слоты. Б.[code]void SCANSAVER::onReadyRead() { QByteArray data = socket->readAll(); controlBuffer.append(data); // Process control messages line by line (terminated by '\n') int newlineIndex; while ((newlineIndex = controlBuffer.indexOf('\n')) >= 0) { QByteArray line = controlBuffer.left(newlineIndex); controlBuffer.remove(0, newlineIndex + 1); QString str = QString::fromUtf8(line).trimmed(); if (str.startsWith("PATH:")) { QStringList parts = str.split(';'); for (const QString &part : parts) { if (part.startsWith("PATH:")) { m_basePath = part.mid(5).trimmed(); qDebug() state() == QAbstractSocket::ConnectedState) { socket->disconnectFromHost(); if (socket->state() != QAbstractSocket::UnconnectedState) { bool disconnected = socket->waitForDisconnected(3000); // Increased timeout if (!disconnected) { socket->abort(); // Force close if graceful disconnect fails } } } else if (socket->state() != QAbstractSocket::UnconnectedState) { socket->abort(); // Force close for any non-disconnected state } socket->close(); socket->deleteLater(); socket = nullptr; } if (server) { server->close(); server->deleteLater(); server = nullptr; } } Thread B code PROCESSFRAME::PROCESSFRAME(QObject *parent) : QThread{parent}, image(3072, line_in_projection, QImage::Format_Grayscale16), currentLine(0) { socket = new QTcpSocket(this); retryTimer = new QTimer(this); retryTimer->setInterval(500); // retry every 500 ms retryTimer->setSingleShot(true); connect(socket, &QTcpSocket::connected, [](){ qDebug() state() == QAbstractSocket::ConnectedState || socket->state() == QAbstractSocket::ConnectingState) return; // already connected or connecting socket->abort(); // cancel any previous attempt socket->connectToHost(QHostAddress::LocalHost, 12345); if (!socket->waitForConnected(100)) { // non-blocking short wait qWarning() start(); } } void PROCESSFRAME::SendSavePath(QString path, int dualEnergy) { if (socket->state() == QAbstractSocket::ConnectedState) { QByteArray msg = "PATH:" + path.toUtf8() + ";DUAL:" + QByteArray::number(dualEnergy) + "\n"; socket->write(msg); socket->flush(); qDebug() write(msg); socket->flush(); qDebug() Подробнее здесь: [url]https://stackoverflow.com/questions/79754019/tcp-connect-failing-after-restarting-application[/url]