Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
otmorozok89
0 / 0 / 0
Регистрация: 05.08.2016
Сообщений: 3
1

Переход на резервный канал

05.08.2016, 15:56. Просмотров 452. Ответов 3
Метки нет (Все метки)

Добрый день уважаемые формучане! У меня не было раньше опыта работы с сетью в Qt! была поставлена задача "Необходимо реализовать пересылку файла с одного клиента на другой. Для пересылки всегда используется основной интерфейс. Во время пересылки файла, в случае потери соединения на основном интерфейсе, клиент должен задействовать резервный и продолжить пересылку через него. Если соединение на основном интерфейсе было восстановлено, то клиент переходит обратно на использование основного интерфейса "

я пытаюсь так
---клиент
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 QByteArray buf /*= file.readAll()*/;
        while (!file.atEnd()) {
            buf += file.readLine();
        }
        stream << quint64(file.size());
        stream << buf;
        TotalBytes = block.size();
 
        if(statSocket1&& pSocket->state()==QAbstractSocket::ConnectedState)
        {
            ui->list_log->addItem("Начата передача файла "+ file.fileName()+" по каналу 1");
            bytesToWrite = TotalBytes - (int)pSocket->write(block,block.size());
        }
        else if(statSocket2&& pSocket_2->state()==QAbstractSocket::ConnectedState)
        {
            ui->list_log->addItem("Начата передача файла "+ file.fileName()+" по каналу 2");
            bytesToWrite = TotalBytes - (int)pSocket_2->write(block,block.size());
        }
        else
        {
            QMessageBox msgBox;
            msgBox.setText("Ошибка отправки файла!");
            msgBox.setWindowTitle("Ошибка");
            if(statSocket1)
                msgBox.setDetailedText(getState(pSocket->state()));
            else
                msgBox.setDetailedText(getState(pSocket_2->state()));
            msgBox.setIcon(QMessageBox::Critical);
            msgBox.exec();
            return;
        }
--сервер
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
QTcpSocket * socket = static_cast<QTcpSocket*>(sender());
    if(log)
    {
        ui->listWidget->addItem("начат прием файла с "+socket->localAddress().toString());
        log=false;
    }
    forever
    {
        QDataStream stream(socket);
        stream.setVersion(QDataStream::Qt_4_8);
        if (nextBlockSize == 0)
        {
            //qDebug()<<socket->bytesAvailable();
            if (socket->bytesAvailable() < sizeof(quint64))
                return;
            stream >> nextBlockSize;
        }
        int ba = socket->bytesAvailable();
        ui->serverProgressBar->setMaximum((int)nextBlockSize);
        ui->serverProgressBar->setValue((int)ba);
 
        if (nextBlockSize > socket->bytesAvailable())
            return;
        QByteArray arrFile;
 
        stream >> arrFile;
        QFile file("/tmp/new.dat");
        QFileInfo inf_f("/tmp/new.dat");
        file.open(QIODevice::WriteOnly);
        file.write(arrFile);
        if(file.exists())
        {
            ui->listWidget->addItem("Файл размером: "+QString::number(arrFile.size()/1024)+" KB успешно записан по пути:"+inf_f.absoluteFilePath());
            ui->serverProgressBar->setValue((int)nextBlockSize);
            QApplication::restoreOverrideCursor();
        }
        else
            ui->listWidget->addItem("Ошибка записи файла по пути: "+inf_f.absoluteFilePath());
        nextBlockSize = 0;
        log=true;
    }
С одним каналом проблем нет, но при имитации обрыва канала, он все равно передает по нему! Как я понимаю, при использовании QDataStream когда уже начата передача, изменить канал уже не получится! Была идея сделать скрип на bash по резервированию канала, но задача была реализовать программно! Уже 2 неделю топчусь на месте! В инете и на форумах ничего подобного не нашел) Заранее спасибо)
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2016, 15:56
Ответы с готовыми решениями:

Резервный канал в TMG
Доброго времени суток, господа! Поставил себе амбициозную задачу: настроить резервный внешний канал...

Резервный канал связи по Wi-Fi
Доброго времени. Глупый вопрос. Есть сервер 2012, есть бухгалтер 1967, между ними сеть из витой...

Резервный канал связи
Есть сервер-Домино , в нем настройка при отправке на домен dom1.net, мой сервер напрямую(не...

Резервный канал глючит
есть проблема . при падении основного канала , резервный работает 5 сек и опять переключается на...

Направление клиента в резервный канал
Доброго всем. Перерыл кучу всего, даже вебинар посмотрел, но то чего нужно не нашел, уже не знаю...

3
Slip.
92 / 92 / 33
Регистрация: 17.03.2012
Сообщений: 536
Завершенные тесты: 1
05.08.2016, 16:38 2
Возможно, у вас не происходит обрыв канала при имитации? До сервера доходят сообщения?
Попробуйте при разрыве вывести socket->state(). Возможно, он до сих пор Connected.
А еще вы, наверное, Шлее пользовались?

А еще есть вот такой флаг QAbstractSocket::ClosingState The socket is about to close (data may still be waiting to be written).
0
otmorozok89
0 / 0 / 0
Регистрация: 05.08.2016
Сообщений: 3
05.08.2016, 17:05  [ТС] 3
я делал дисконект на сокете, а socket->state() вообще вещь странная, когда физически сеть вырубаешь, он все равно пишет что Connected! Состояние я проверяю через пинг хоста! Сначала брал Шлее, потом под себя переделывал!

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
 QByteArray      output;
    output = ping->readAllStandardOutput ();
    QString status = output.data();
    if(status.toLower().contains("unreachable")||emit_1)
            statSocket1=false;
       else
    {
        if(!statSocket1)
            ui->list_log->addItem("Соедение с каналом 1 восстановлено");
        statSocket1=true;
     
        }
0
otmorozok89
0 / 0 / 0
Регистрация: 05.08.2016
Сообщений: 3
05.08.2016, 17:25  [ТС] 4
вот полный код, там творческий беспорядок)
0
Вложения
Тип файла: zip net.zip (851.6 Кб, 2 просмотров)
05.08.2016, 17:25
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2016, 17:25

Резервный канал интернета (Москва)
Здравствуйте, возникла необходимость в резервном канале интернета, но пров на территории БЦ...

Резервный канал на базе ZyXel Keenetic 4G
Доброго люди. Решил организовать отказоустойчивость, через роутер ZyXel Keenetic 4G (C...

Не встает ipsec через Yota. Как сделать резервный канал используя только возможности цисок?
всем привет помогите нубу есть главный офис в котором стоит cisco asa 5510 из филиала к ней по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.