Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 626
1

asio+bind

18.08.2013, 15:34. Показов 1576. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
при выполнении в bind.hpp и handler_type_requirements.hpp возникают ошибки
вот код Server.h
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
#ifndef SERVER_H
#define SERVER_H
 
#include <iostream>
#include <QtGlobal>
#include <QFile>
#include <QTextStream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/shared_array.hpp>
#include <boost/thread.hpp>
 
typedef boost::shared_ptr<boost::asio::ip::tcp::socket> socket_ptr;
 
class Server
{
public:
    Server(const qint16 port);
    bool WorkResult();
    void system_handler(boost::shared_array<char> data, socket_ptr sockets);
    void file_handler(boost::shared_array<char> data, socket_ptr sockets);
    void text_handler(boost::shared_array<char> data, socket_ptr sockets);
private:
    static const size_t data_length = 520;
    bool end_flag = false;
    boost::asio::ip::tcp::endpoint endpoint_;
    QString file_name = "";
    void start_accept(boost::asio::ip::tcp::acceptor * acceptor);
    void on_accept_handler(boost::asio::ip::tcp::acceptor* acceptor,
                               socket_ptr sockets,
                               const boost::system::error_code& error);
    void data_handler(socket_ptr sockets,
                          boost::shared_array<char> data,
                          boost::system::error_code& error);
};
 
#endif // SERVER_H
и код Server.cpp
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "server.h"
 
Server::Server(qint16 port):endpoint_(boost::asio::ip::tcp::v4(),port){
    boost::asio::io_service io_service;
    boost::shared_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(io_service));
    size_t cpu_count = boost::thread::hardware_concurrency();
    boost::thread_group work_threads;
    for(size_t i = 0; i < cpu_count; i++){
        work_threads.create_thread(boost::bind(&boost::asio::io_service::run, &io_service));
    }
    boost::asio::ip::tcp::acceptor (io_service,endpoint_);
    work.reset();
    work_threads.join_all();
    end_flag = true;
}
 
bool Server::WorkResult(){
    return end_flag;
}
 
void Server::system_handler(boost::shared_array<char> data, socket_ptr sockets){
    QFile file(file_name);
    file.open(QIODevice::ReadWrite);
}
 
void Server::file_handler(boost::shared_array<char> data, socket_ptr sockets){
     //
}
 
void Server::text_handler(boost::shared_array<char> data, socket_ptr sockets){
    //
}
 
    //начало асинхронного подключения
void Server::start_accept(boost::asio::ip::tcp::acceptor * acceptor){
    socket_ptr sockets(new socket_ptr::element_type(acceptor->get_io_service()));
    acceptor->async_accept(*sockets,
                           boost::bind(&Server::on_accept_handler,
                           acceptor,
                           sockets,
                           boost::asio::placeholders::error()));
}
    //получение данных
void Server::on_accept_handler(boost::asio::ip::tcp::acceptor* acceptor,
                               socket_ptr sockets,
                               const boost::system::error_code& error){
    if(!error){
        boost::shared_array<char> data(new char[data_length]);
        boost::asio::async_read(*sockets,
                                boost::asio::buffer(data.get(),data_length),
                                boost::asio::transfer_at_least(2),
                                boost::bind(&Server::data_handler,
                                            sockets,
                                            data,
                                            boost::asio::placeholders::error()));
    }else{
           /* boost::bind(&error_send_handler,
                        sockets,
                        boost::asio::placeholders::error());*/
    }
    start_accept(acceptor);
}
    //обработчик ошибки
    //void error_send_handler(socket_ptr sockets, const boost::system::error_code& error)
    //обработчик полученных данных
void Server::data_handler(socket_ptr sockets,
                          boost::shared_array<char> data,
                          boost::system::error_code& error){
    if(! error){
        switch(data[0]){
        case 's': system_handler(data,sockets); //обработчик системной информации
            break;
        case 'f': file_handler(data,sockets); //обработчик файлов
            break;
        case 't': text_handler(data,sockets); //обработчик текстовой информации
            break;
        }
    }
}
в чем ошибка?
Миниатюры
asio+bind   asio+bind  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2013, 15:34
Ответы с готовыми решениями:

Boost::asio::ip::udp::socket bind а мне нужен не локальный хост
Здравствуйте. Пытаюсь наладить для своих нужд пример #include &lt;iostream&gt; #include &lt;string&gt;...

asio
Здравствуйте, хочу спросить у вас совета, дело вот в чем у меня есть асинхронные операции.......

Asio, g++
Не компилируется проект. Код: #include &lt;boost/asio.hpp&gt; #include &lt;iostream&gt; #include...

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

8
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 626
18.08.2013, 15:36  [ТС] 2
Ошибка 1:
C:\Qt\boost_1_54_0\boost\bind\bind.hpp:69: ошибка: 'void (Server::*)(boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>*, boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >, const boost::system::error_code&)' is not a class, struct, or union type

Ошибка 2:
C:\Qt\boost_1_54_0\boost\bind\bind.hpp:69: ошибка: 'void (Server::*)(boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip:: tcp> >, boost::shared_array<char>, boost::system::error_code&)' is not a class, struct, or union type

Ошибка 3:
C:\Qt\boost_1_54_0\boost\asio\detail\handler_type_requirements.hpp:212: ошибка: no match for call to '(boost::_bi::bind_t<boost::_bi::unspecified, void (Server::*)(boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>*, boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >, const boost::system::error_code&), boost::_bi::list3<boost::_bi::value<boost::asio::basic_socket_acceptor<boost::as io::ip::tcp>*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio ::ip::tcp> > >, boost::arg<1> > >) (const boost::system::error_code&)'

Ошибка 4:
C:\Qt\boost_1_54_0\boost\asio\detail\handler_type_requirements.hpp:186: ошибка: no match for call to '(boost::_bi::bind_t<boost::_bi::unspecified, void (Server::*)(boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip:: tcp> >, boost::shared_array<char>, boost::system::error_code&), boost::_bi::list3<boost::_bi::value<boost::shared_ptr<boost::asio::basic_stream_ socket<boost::asio::ip::tcp> > >, boost::_bi::value<boost::shared_array<char> >, boost::arg<1> > >) (const boost::system::error_code&, const unsigned int&)'
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.08.2013, 17:15 3
C++
1
2
3
4
                           boost::bind(&Server::on_accept_handler,
                           acceptor,
                           sockets,
                           boost::asio::placeholders::error()));
Где this, который должен идти вторым параметром, т.к. функция - член класса?
Ну и по-моему создание объекта типа
C++
1
boost::asio::placeholders::error
абсолютно бесполезно.
1
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 626
18.08.2013, 19:56  [ТС] 4
ForEveR, спасибо все норм, нужно было комп перезагрузить

Добавлено через 1 час 8 минут
ForEveR, косяки не ушли. не совсем понял, куда this ставить?

Добавлено через 8 минут
исправил в двух местах
Цитата Сообщение от korep Посмотреть сообщение
boost::bind(&Server::data_handler,
* * * * * * * * * * * * * * * * * * * * * * sockets,
* * * * * * * * * * * * * * * * * * * * * * data,
* * * * * * * * * * * * * * * * * * * * * * boost::asio:laceholders::error()));
Цитата Сообщение от korep Посмотреть сообщение
boost::bind(&Server::on_accept_handler,
* * * * * * * * * * * * * *acceptor,
* * * * * * * * * * * * * *sockets,
* * * * * * * * * * * * * *boost::asio:laceholders::error()));
но все равно одна ошибка остается. где не понимаю:
C:\Qt\boost_1_54_0\boost\bind\bind.hpp:457: ошибка: no match for call to '(boost::_mfi::mf3<void, Server, boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >, boost::shared_array<char>, boost::system::error_code&>) (Server*&, boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >&, boost::shared_array<char>&, const boost::system::error_code&)'
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.08.2013, 20:06 5
korep, bind должен выглядеть так.
C++
1
2
3
4
5
                           boost::bind(&Server::on_accept_handler,
                           this,
                           acceptor,
                           sockets,
                           boost::asio::placeholders::error)
1
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 626
18.08.2013, 20:30  [ТС] 6
уже догнал, но здесь еще какая-то ошибка
C++ (Qt)
1
2
3
4
5
6
7
8
boost::asio::async_read(*sockets,
                                boost::asio::buffer(data.get(),data_length),
                                boost::asio::transfer_at_least(2),
                                boost::bind(&Server::data_handler,
                                            this,
                                            sockets,
                                            data,
                                            boost::asio::placeholders::error()));
Добавлено через 22 минуты
Вот сама ошибка.
C:\Qt\boost_1_54_0\boost\bind\bind.hpp:457: ошибка: no match for call to '(boost::_mfi::mf3<void, Server, boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >, boost::shared_array<char>, boost::system::error_code&>) (Server*&, boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >&, boost::shared_array<char>&, const boost::system::error_code&)'
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.08.2013, 21:28 7
korep, Уберите скобки у
C++
1
boost::asio::placeholders::error
и error бы хорошо принимать через const, не меняется ведь в функции.
1
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 626
18.08.2013, 21:48  [ТС] 8
спасибо. заработало!

Добавлено через 37 секунд
ForEveR, получается я передавал конструктор, а не переменную?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.08.2013, 22:40 9
korep, Нет. Вы передавали временный объект, а принимали ссылку.
1
18.08.2013, 22:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.08.2013, 22:40
Помогаю со студенческими работами здесь

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

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

Asio client
Здравствуйте! Пишу клиентское приложение с использованием boost asio. Возникла необходимость...

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


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

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