Russian Qt Forum
Ноябрь 22, 2024, 08:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Qt / Работа с сетью / Re: Финансовая благодарность за правильный ответ: ошибка при чтении порта по сети : Апрель 18, 2021, 08:02
Выяснил, что при вылете программы приема портится сокет clientsocket.

При нормальной работе в программе приема после строки clientsocket = tcpServer->nextPendingConnection(); и перед строкой read_size = clientsocket->read(rpkg, BUF_SIZE); байты сокета одинаковые, а во время вылета программы в этих строках байты сокета разные.

Примерный ученик, ваш совет наиболее конкретен, но тоже не решил проблему.
А вы принимали вашим способом данные на две машины с одной машины?

2  Qt / Работа с сетью / Re: Финансовая благодарность за правильный ответ: ошибка при чтении порта по сети : Апрель 10, 2021, 19:50
BUF_SIZE == FRAME_SIZE ?

Да.
3  Qt / Работа с сетью / Финансовая благодарность за правильный ответ: ошибка при чтении порта по сети : Апрель 10, 2021, 11:52
В сети есть 4 машины.
От 1й машины данные проходят через 2ю машину, со 2й машины одинаковые данные поступают на 3ю и 4ю машины.

передача на 2й машине:

Код:
    socket = new QTcpSocket(this);

int writeDev::write(const QByteArray & pkg)
{
    int written = 0;
    written = socket->write(pkg, pkg.size());  
}

прием на 3й и 4й машинах:

Код:
#define BUF_SIZE  10000
#define FRAME_SIZE  10000

    clientsocket = new QTcpSocket(this);  
    tcpServer = new QTcpServer();
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnect()));


void MainWindow::newConnect()
{
    clientsocket = tcpServer->nextPendingConnection();    
    
    connect(clientsocket, SIGNAL(readyRead()),
            this, SLOT(recPkg()));  
            
    connect(clientsocket, SIGNAL(disconnected()),
            clientsocket, SLOT(deleteLater()));            

}


void MainWindow::recPkg()
{
    int read_size = 0;
    char rpkg[FRAME_SIZE];

    read_size = clientsocket->read(rpkg, BUF_SIZE);

    //обработка данных
}


Когда данные передаются в сети: 1-2-3 или 1-2-4 машины, то ошибок нет.

В сети 1-2-3-4 данные передаются нормально, но периодически или на 3й, или на 4й машине вылетает программа приема. При этом если на 3й программа вылетела, то на 4й работает нормально, если вылетела на 4й, то на 3й работает нормально.

В отладчике на машине, где вылетела программа, выдает в разных случаях такие ошибки:

1. QIODevice:: read called on a WriteOnly device

2. Program received signal SIGSEGV. Segmentation fault.
0x6900529f in ZN9QIODevice4readEPcx from C:\Windows\system32\QtCore4.dll


Готов отблагодарить финансово за ответ, который полностью поможет решить проблему.


Страниц: [1]

Страница сгенерирована за 0.126 секунд. Запросов: 24.