Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
#1

Найти ошибки, которые не дают сделать асинхронный сервер - C++

09.11.2012, 14:33. Просмотров 337. Ответов 1
Метки нет (Все метки)

Хотелось мне сделать обертку вокруг асио. Чтобы обьект класса в одно время был сервером, в другое клиентом. Чтобы все быстро бегало, захотелось асинхронностью занятся. В итоге, как сервер он не фурычит, следовательно его клиентскую работоспособность проверить нет возможности. Помогите разобраться (в частности найти ошибки, которые не дают сделать асинхронный сервер(может ошибка во мне, может неправильно доку понял.))

Вот сам класс

C++
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
class NetworkManager{
    std::string IP;
    unsigned short Port;
    static boost::asio::io_service io;
    boost::asio::ip::tcp::acceptor *acc;
    data(*analys)(data);
    void server_handler(const boost::system::error_code& error,boost::asio::ip::tcp::socket* s){
        if(!error){
            data A;
            std::stringstream file;
            Read(s,&file);
            boost::archive::binary_iarchive(file) >> A;
            A=analys(A);
            boost::archive::binary_oarchive(file) << A;
            Write(s,&file);
        }
    }
    void io_handler(const boost::system::error_code& error){
        ;
    }
    void connect_handler(const boost::system::error_code& error,boost::asio::ip::tcp::socket *s,data* M){
        if(!error){
            std::stringstream file;
            boost::archive::binary_oarchive(file) << (*M);
            Write(s,&file);
            while(!s->available());
                Read(s,&file);
            s->close();
            boost::archive::binary_iarchive(file) >> (*M);
            Servered();
        }
    }
    void Write(boost::asio::ip::tcp::socket *s,char *a,size_t size){
        boost::asio::async_write(*s, boost::asio::buffer(&size,sizeof(size_t)),boost::bind(&NetworkManager::io_handler,*this,boost::asio::placeholders::error));        
        boost::asio::async_write(*s, boost::asio::buffer(a,size),boost::bind(&NetworkManager::io_handler,*this,boost::asio::placeholders::error));
    }
    void Write(boost::asio::ip::tcp::socket *s,std::stringstream *file){
        file->seekg(std::ios_base::end);
        size_t size=file->tellg();
        char *a;
        file->read(a, size);
        Write(s,a,size);
    }
    void Read(boost::asio::ip::tcp::socket *s,char *a,size_t *size){
        boost::asio::async_read(*s,boost::asio::buffer(size,sizeof(size_t)),boost::bind(&NetworkManager::io_handler,*this,boost::asio::placeholders::error));
        boost::asio::async_read(*s,boost::asio::buffer(a,*size),boost::bind(&NetworkManager::io_handler,*this,boost::asio::placeholders::error));
    }
    void Read(boost::asio::ip::tcp::socket *s,std::stringstream *file){
        file->str("");
        char *a;
        size_t size;
        Read(s,a,&size);
        file->write(a,size);
    }
 
public:
    NetworkManager(){
        acc=NULL;
    }
    boost::asio::ip::tcp::socket* NewSocket(){return new boost::asio::ip::tcp::socket(io);}
    void SetIP(std::string s){IP=s;}
    void SetPort(unsigned short p){Port=p;}
 
    void Session(data *A){
        boost::asio::ip::tcp::socket* S=NewSocket();
        S->async_connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string(IP), Port),boost::bind(&NetworkManager::connect_handler,*this,boost::asio::placeholders::error,S,A));
    }
    void Servered(){
        if(acc!=NULL)
            acc=new boost::asio::ip::tcp::acceptor(io, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 26000));
        auto S=NewSocket();
        acc->async_accept(*S,boost::bind(&NetworkManager::server_handler,*this,boost::asio::placeholders::error,S));
    }
    void Disconnected(boost::asio::ip::tcp::socket *sock){sock->close();}
    void SetAnalyser(data(*a)(data)){analys=a;}
    static void Run(){io.run();}
};
Мейн

C++
1
2
3
4
5
6
7
data F(ata A){return data("QWERTYUI");}
int main()
{
    NetworkManager N;
    N.SetAnalyser(F);
    NetworkManager::Run();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2012, 14:33     Найти ошибки, которые не дают сделать асинхронный сервер
Посмотрите здесь:

Напечатать все трехзначные числа, которые при деления на 13 дают остаток 5. C++
Найти все меньшие 100 натуральные числа, которые при возведении в квадрат дают палиндром. C++
C++ Найти те числа последовательности, которые при делений на 7 дают остаток 1,2 или 5
C++ Найти те члены последовательности, которые при делении на 5 дают остаток 1
C++ Матрицы: найти количество элементов,которые при делении на 5 дают в остатке 1
C++ Найти количество элементов матрицы, которые при делении на 5 дают в остатке 1
C++ Найти те члены последовательности, которые при делении на 7 дают остаток 1, 2, 5.
C++ Определить сумму чисел, которые при деление на n дают в остатке q
C++ Найти сумму чисел в диапазоне [a;b], которые при возведении в квадрат дают число с последней цифрой 6
C++ Найти числа из заданного интервала, которые при делении на число d дают в остатке z
Поиск пар чисел в массиве, которые в сумме дают определенное число C++
C++ Найти все меньшие 100 натуральные числа, которые при возведении в квадрат дают палиндром

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
09.11.2012, 23:17     Найти ошибки, которые не дают сделать асинхронный сервер #2
C++
1
if(acc!=NULL)
?
Может наоборот, когда NULL, надо создать новый

И вопрос - acceptor.listen(); не надо делать? нашел свой код годичной давности, где я мучил асио. Там у меня были такие строки:

C++
1
2
3
4
m_acceptor.open(endpoint.protocol());
m_acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
m_acceptor.bind(endpoint);
m_acceptor.listen();
Yandex
Объявления
09.11.2012, 23:17     Найти ошибки, которые не дают сделать асинхронный сервер
Ответ Создать тему
Опции темы

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