QT - получение данных от UDP и сохранить в файлC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 QT - получение данных от UDP и сохранить в файл

Сообщение Anonymous »

Я хочу написать программу, которая будет получать некоторые данные через UDP, а затем написать необработанные байты в файл. Я думаю, что лучшим решением было бы разделить операции файлов и операции сокетов на отдельные потоки. Что вы думаете? Я не совсем уверен, что правильно выполнил операции с закрытием и чтением файлов. Проблема в том, что когда я нажимаю кнопку «Пуск», мне нужно начать получать данные, и когда я нажимаю остановку, мне нужно прекратить получать данные. Другими словами, прием данных должен быть приостановлен.class UdpClient : public QObject
{
Q_OBJECT
public:
explicit UdpClient(QObject *parent = nullptr);
~UdpClient() override;

bool listen(quint64 port);
void close();
signals:
void Received(QByteArray& arr);
private slots:
void readyRead();
private:
bool listening = false;
QUdpSocket socket;
};
< /code>
Имлеменция проста: < /p>
UdpClient::UdpClient(QObject *parent)
: QObject{parent}
{
connect(&m_socket, &QAbstractSocket::readyRead, this, &UdpClient::readyRead);
}

UdpClient::~UdpClient()
{
socket.close();
}

bool UdpClient::listen(quint64 port)
{
if (addr != socket.localAddress() || port != socket.localPort()) {
socket.close();
listening = socket.bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress);
} else {
listening = true;
}
return listening;
}

void UdpClient::close()
{
listening = false;
}

void UdpClient::readyRead()
{

if (!listening)
return;

QByteArray dgram;

while (socket.hasPendingDatagrams()) {
const auto bytesToRead = socket.pendingDatagramSize();
dgram.resize(bytesToRead);
socket.readDatagram(dgram.data(), dgram.size());

emit Received(dgram);
}
}
< /code>
file op class: < /p>
class FileWriterWorker : public QObject {
Q_OBJECT

public:
FileWriterWorker() : m_outputFile(nullptr) {}
~FileWriterWorker() override = default;

public slots:
void startWriting(const QString &fileName);
void writeData(const QByteArray &data);
void stopWriting();

signals:
void fileError(const QString &title, const QString &message);
void fileClosed(const QString &finalPath);

private:
QFile *outputFile;
};

void FileWriterWorker::startWriting(const QString &fileName) {
outputFile = new QFile(fileName);
if (!outputFile->open(QIODevice::WriteOnly)) {
emit fileError("File Error", "Could not create or open the log file for writing.");
delete outputFile;
outputFile = nullptr;
}
}

void FileWriterWorker::writeData(const QByteArray &data) {
if (outputFile && outputFile->isOpen()) {
outputFile->write(data);
}
}

void FileWriterWorker::stopWriting() {
if (m_outputFile) {
const QString savedFileName = outputFile->fileName();
outputFile->close();
delete outputFile;
outputFile = nullptr;
emit fileClosed(savedFileName);
}
}
< /code>
Я не включил код для основного класса, поскольку он содержит две кнопки и два потока, где мы перемещаем наши классы UDP и Fileop. Я не уверен, что это лучший подход. Я также не уверен, что люди все еще используют механизмы, отличные от будущего. Что ты думаешь?

Подробнее здесь: https://stackoverflow.com/questions/797 ... ve-to-file
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»