Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
71 / 71 / 58
Регистрация: 12.12.2013
Сообщений: 420
1

Boost asio + qt (slots)

17.03.2018, 13:00. Показов 1383. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! В общем, имеется клиентский код из документации boost::asio (<ТЫК>)

Он у меня является базовым классом. От него создаю дочерний класс, который подготавливает запросы.
Важная ремарочка: в конструкторе Client не происходит ассинхронного соединения, там только копируется итератор. Все происходит в отдельном методе Connect()

C++
1
2
3
4
5
6
7
8
9
10
11
12
void Client::Connect()
{
    size_t s = _streambuffer.size();
    _streambuffer.consume(s);
    answer.empty();
 
    socket_.set_verify_mode(boost::asio::ssl::verify_peer | boost::asio::ssl::verify_fail_if_no_peer_cert);//
    socket_.set_verify_callback(boost::bind(&Client::verify_certificate, this, _1, _2));
    //socket_.set_verify_callback(boost::asio::ssl::rfc2818_verification("dh2048.pem"));
    boost::asio::async_connect(socket_.lowest_layer(), _iterator,
        boost::bind(&Client::handle_connect, this, boost::asio::placeholders::error));
}
Есть еще класс для графического интерфейса, в котором есть ссылка на дочерний класс класса Client, инициализируемый в конструкторе GUI. Если после инициализации вызвать метод дочернего класса, который в свое время вызывает Connect(), то все прекрасно исполняется. Но если вызвать этот же метод через указатель в слоте, то соединения не происходит (boost::asio::async_connect()). Не выполняется в том числе и handshake.

GUI:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GUI::GUI()
{
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query("example.com", "https");//example.com - целенаправлено изменено 
    boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23_client);
    ctx.load_verify_file("MyDomain_public.pem");
    boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve(query);
    boost::asio::ip::tcp::endpoint endpont = *iter;
    std::cout << endpont.address().to_string() << ":" << endpont.port();
        
    _child_obj = new example_com(io_service, ctx, iter);//_child_obj - pointer (public: example_com * _child_obj;)
      /*std::string str ="data data data....";
    _child_obj->for_Send(str);//отправилось удачно!*/
    io_service.run();
}
void GUI::slot_Send()
C++
1
2
3
4
5
6
7
8
9
10
void GUI::slot_Send()
{
    QWidget *widget = new QWidget(obj_FirstPage);
    widget->setWindowFlags(Qt::Window);
    widget->setGeometry(50, 100, 600, 500);
    widget->setMaximumSize(600, 500);
    widget->show();
    std::string str ="data data data....";
    _child_obj->for_Send(str);
}
example_com::for_Send(std::string str)
C++
1
2
3
4
5
6
7
8
void example_com::for_Send(std::string str)
{
    std::string request;
       /*подготовим запрос*/
    if (this->set_request(request))//метод класса Client записывает в свой буфер данные, которые нужно отправит.
        Connect();//должен соединиться с сервером и отправить. но не соединяется.
    //return true;
}

Слот связывается с сигналом в конструкторе GUI:
C++ (Qt)
1
2
3
4
QPushButton *send_data_button = new QPushButton(this);
    send_data_button->setText("Send_data..."); send_data_button->setFont(font);
    send_data_button->setGeometry(150, 300, 200,70);
    QObject::connect(send_data_button, &QPushButton::clicked, this, &GUI::slot_Send);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2018, 13:00
Ответы с готовыми решениями:

Boost.asio
Добрый день. Я только начал знакомство с boost.asio и при использовании примеров с офф.сайта...

Boost Asio C++
Добрый день. Юзаю этот ( http://www.boost.org/ ) проект. Нужна помощь с документаций...

boost::asio
начал ковырять буст. Возник вопрос с созданием клинт-серверного приложения. Для ознакомления хочу...

boost/asio
Кто тестил asio в Вuilder-е? Код использовал отсюда...

2
71 / 71 / 58
Регистрация: 12.12.2013
Сообщений: 420
19.03.2018, 23:43  [ТС] 2
В общем, io_service останавливается, если все асинхронные операции заканчиваются, а это значит, что его нужно запускать по-новой (io_service.reset()).
Как раз в конструкторе у меня инициализируется только сокет и все, больше никаких операций, поэтому io_service перестает работать, а значит больше никаких асинхронных операций выполнятся не могут
void GUI::slot_Send()
C++
1
2
3
4
5
io_service->reset();
bool stop= io_service->stopped();
 std::string str ="data data data....";
_child_obj->for_Send(str)
io_service->run();
а сокет сделал умным указателем, чтомы тоже можно было пересоздавать (std::auto_ptr - нужен же один экземпляр "socket_>reset()")
работает, но, думаю, что это не самое лучшее решение.
0
71 / 71 / 58
Регистрация: 12.12.2013
Сообщений: 420
27.03.2018, 18:59  [ТС] 3
Так, столкнулся с проблемой!
Нужно придумать некий механизм, который отследит получение ответа от сервера классом Client и продолжит выполнение в example.com, из которого и была вызвана асинхронная цепочка вызовов.
0
27.03.2018, 18:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2018, 18:59
Помогаю со студенческими работами здесь

boost::asio пример
Привет! Можно, пожалуйста, простейший пример работы с boost::asio - клиент-серверная программа,...

Boost.Asio не соединяется
Здравствуйте форумчане, недавно начал изучать boost.asio Скомпилил из примеров Server Client,...

boost::asio cессии
Здравствуйте. Хотелось бы узнать ответ на вопрос, который не где не нашол. Сервер реализован на...

Winsock vs boost::asio
у Winsock преимущество - это есть русская документация(это не совсем документация но крис касперски...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru