1

Тема: Boost::asio, async_receive_from, як передати свої дані в handler?

Хай, от мій кід, ліл.

#include <cstdlib>
#include <iostream>
#include <boost\asio.hpp>

using namespace boost::asio;

io_service service;
ip::udp::socket sock(service);
char buff[1024];

void receive_callback(const boost::system::error_code& ec, std::size_t bytes_transferred)
{
    std::cout << "Got " << bytes_transferred<< " bytes" <<std::endl;
    sock.async_receive(buffer(buff), receive_callback);
}

int main()
{
    try{
        ip::udp::endpoint endPoint(ip::udp::v4(), 9050);
        sock.open(ip::udp::v4());
        sock.bind(endPoint);
        ip::udp::endpoint senderEP;
        sock.async_receive_from(buffer(buff), senderEP, 0, receive_callback);

        service.run();
    }
    catch (std::exception ex)
    {
        std::cout <<"Error: " << ex.what() << std::endl; 
    }

    system("pause>>void");
    return 0;
}

Я так розумію, що в змінну senderEP заносяться дані відправника, ну типу з якого ip та порта прийшли дані.
Але як мені передати ось ці дані в функцію receive_callback?
Вона ж приймає лише код помилки та розмір отриманих даних.
Я ж хочу зробити, аби після отримання даних відбувалась якась штука дрюка, наприклад, щоб sendEP записувався в контейнер, але спочатку перевірялось, чи я такі дані в контейнері, а потім, щоб відправляти отримане повідомлення всім, хто в контейнері.
Ну ви зрозуміли, простий чатик, без сессій.
Як мені бути?

2

Re: Boost::asio, async_receive_from, як передати свої дані в handler?

Прихований текст

як це ви так, лягаєте в годину ночі, а в 7 годин ранку вже на ногах?

3

Re: Boost::asio, async_receive_from, як передати свої дані в handler?

Очевидно, якимось іншим чином - наприклад, проголосивши буфер глобальною змінною. Що у вас і зроблено.

Подякували: FakiNyan1

4

Re: Boost::asio, async_receive_from, як передати свої дані в handler?

koala написав:

Очевидно, якимось іншим чином - наприклад, проголосивши буфер глобальною змінною. Що у вас і зроблено.

А якщо одночасно прийдуть повідомлення, не виникне якоїсь взаємоблокуючої ситуації, або витіку інформації?
В С++ є ж щось типу lock, аби блокувати буфер під час перебору його значень?

5

Re: Boost::asio, async_receive_from, як передати свої дані в handler?

Наскільки я розумію, в asio асинхронні операції виконуються в тому ж потоці, що й запити, тобто блокування не буде; ну і користуйтеся синхронним в/в, якщо сумніваєтеся.
А потоки і м'ютекси є в стандарті починаючи з C++11, і окремо є потоки в boost.

Подякували: FakiNyan1

6

Re: Boost::asio, async_receive_from, як передати свої дані в handler?

ех, пане koala, пане koala, ви тим boost'ом взагалі користувались? ;D

#include <cstdlib>
#include <iostream>
#include <boost\asio.hpp>
#include <boost\bind.hpp>

using namespace boost::asio;

void receive_callback(const boost::system::error_code& ec, std::size_t bytes_transferred, char buff[])
{
    buff[bytes_transferred] = '\0';
    std::cout << "Got " << bytes_transferred<< " bytes: " << buff <<std::endl;
    //sock.async_receive(buffer(buff), receive_callback);
}

int main()
{
    try{
        io_service service;
        ip::udp::socket sock(service);
        char buff[1024];
        ip::udp::endpoint endPoint(ip::udp::v4(), 9050);
        sock.open(ip::udp::v4());
        sock.bind(endPoint);
        ip::udp::endpoint senderEP;
        sock.async_receive_from(buffer(buff), senderEP, 0, boost::bind(receive_callback,_1,_2,buff));

        service.run();
    }
    catch (std::exception ex)
    {
        std::cout <<"Error: " << ex.what() << std::endl; 
    }

    system("pause>>void");
    return 0;
}

7

Re: Boost::asio, async_receive_from, як передати свої дані в handler?

Ні :)
А в чому я помилився?

8

Re: Boost::asio, async_receive_from, як передати свої дані в handler?

koala написав:

Ні :)
А в чому я помилився?

ні в чому, ліл