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

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

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

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

09.11.2012, 14:33. Просмотров 342. Ответов 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     Найти ошибки, которые не дают сделать асинхронный сервер
Посмотрите здесь:

Найти все пятизначные числа, которые при делении на A дают в остатке B, а при делении на C дают в остатке D - C++
C++ Напишите программу, которая вводит четыре натуральных числа (a, b, c и d) и находит все пятизначные числа, которые при делении на a...

Матрицы: найти количество элементов,которые при делении на 5 дают в остатке 1 - C++
дана матрица размера 3х3.найти количество элементов матрицы,которые при делении на 5 дают в остатке 1.борланд си плюс плюс.спасибо заранее

Найти те числа последовательности, которые при делений на 7 дают остаток 1,2 или 5 - C++
1)Даны натуральные числа n,q1....qn.Найти те числа q1 последовательности q1...qn которые при делений на 7 дают остаток 1,2 или 5. ...

Найти количество элементов матрицы, которые при делении на 5 дают в остатке 1 - C++
дана матрица размера 3х3.найти количество элементов матрицы,которые при делении на 5 дают в остатке 1.борланд си плюс плюс.спасибо заранее

Найти числа, которые при делении на 47 дают в остатке 43, а при делении на 43 дают в остатке 47 - C++
Мне нужно написать программу в Dev-C++ для поиска трехзначных чисел, которые при делении на 47 дают в остатке 43, а при делении на 43 дают...

Найти числа из заданного интервала, которые при делении на число d дают в остатке z - C++
в данном интервале (a;b) найти все натуральные числа, которые при деление на натуральное число d, дают в остатке натуральное число z.

Найти все палиндромы в диапазоне от n до m, которые при возведении в квадрат также дают палиндром - C++
програма Найти все числа палиндромы в диапазоне от n до m которые при возведении в квадрат так же дают палиндром. как ее...

Найти сумму чисел в диапазоне [a;b], которые при возведении в квадрат дают число с последней цифрой 6 - C++
Вводятся числа a и b. Найти сумму таких чисел в диапазоне , которые при возведении в квадрат дают число с последней цифрой 6 ...

Определить сумму чисел, которые при деление на n дают в остатке q - C++
С клавиатуры вводятся числа. Окончание ввода – 0. Определить сумму только тех чисел, которые при деление на n дают в остатке q

Поиск пар чисел в массиве, которые в сумме дают определенное число - C++
Условия программы: Дан целочисленный массив положительных чисел,(не отсортированный) и полож число &quot;s&quot; типа int . В массиве нет...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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();
Ответ Создать тему
Опции темы

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