if (client_socket->state() == QAbstractSocket::ConnectedState){
qDebug()<<"send data: state: " << state << " service_name: " << _service_name;
QByteArray send_bytes = QByteArray().append(state).append(_service_name);
client_socket->write(send_bytes);
client_socket->waitForBytesWritten();
}
}
Которая вызывается с достаточно большой частотой. По какой то причине непонятной для меня _service_name туда записывается множество раз. В чем может быть причина?
посмотри сам _service_name через тот же qDebug() здесь же.. может не там траблу ищешь, может у тебя _service_name меняется?
_service_name - константа, которая читается из конфиг файла, поэтому дело не в этом уверен
Прочитайте NOTE на всякий случай https://doc.qt.io/qt-5/qabstractsocket.html#waitForBytesWritten
Если читается из какого-то файла и записывается в _service_name, то как _service_name может быть константой? Может быть ты где-то еще меняешь
А как ты определил, что множество раз записывается? Ты записал в буфер state, service_name и отправил в сокет. На том конце принял state, service_name. А как ты отличаешь одну посылку от другой? И какой тип имеет _service_name?
+ но он имеет ввиду, что только из конфига достается и больше не трогает его вообще
Без полноценного кода верить нельзя)
ну разве что глянуть, не вызывается ли чтение конфига больше одного раза. Может там m_service_name.append(данные_из_конфига) и вызывается несколько раз а append - коварная штука
Там все хуже. Чтобы записать строку в сокет надо либо размер строки передать перед самим содержимым, либо записывать терминирующий ноль и читать тогда до него
да, кстати у тебя с каждой посылкой приписывается _service_name или конечное их количество?
я так понимаю, он проверяет посылку перед отправкой и она у него не соответствует его конструкции QByteArray().append(state).append(_service_name)
один и тот же. он хранится в объекте SendState и отправляется каждый раз при посылке, для сопоставления на принимающей стороне
я проверяю на принимающей стороне. вместо одного service_name выдаётся произвольное количество
а на момент отправки посылка выглядит нормальной? видимо, одна посылка не успела уйти, и пошла следующая WaitForBytesWritten This function blocks until at least one byte has been written on the socket and the bytesWritten() signal has been emitted у тебя программа пошла дальше выполняться, как только хотя бы один байт ушел в буфер из посылки. А ты сам говоришь, что посылка формируется довольно часто
а как ты отличаешься один пакет state + service_name от другого? покажи код чтения
понятно. спасибо. тогда проблема в этом читаю все, что пришло и первый байт как байт пакета. while (socket->bytesAvailable() > 0){ result_array.append(socket->readAll()); }
Обсуждают сегодня