повысить async_receive_from ip-фильтр - PullRequest
0 голосов
/ 13 декабря 2011

Я использую boost::asio для захвата пакетов через порт udp. Я просто новичок для повышения. Как я могу заставить async_receive_from копировать данные в буфер только пакетов с указанным исходным ip?

1 Ответ

2 голосов
/ 15 декабря 2011

В зависимости от того, что вы подразумеваете под перехватом пакетов, такой код будет работать.Это модифицировано из примера Boost Asio Async UDP.socket_ подключен к локальному интерфейсу по указанному port, если вы установите порт в 0, я считаю, что он прослушивает все порты.

Как только вы получите пакет, используя async_receive_from, он также вернет sender_endpoint_ из декодированной дейтаграммы (т. Е. Откуда пришел рассматриваемый пакет). В вашей функции handle_receive_from просто добавьте условный операторпроверить желаемое sender_endpoint_ и «скопировать данные в буфер».

class server
{ 
public: 
    server(boost::asio::io_service& io_service, short port)
    : io_service_(io_service),
    socket_(io_service, udp::endpoint(udp::v4(), port))
    {
        boost::asio::socket_base::receive_buffer_size option(1<<12); <br>
        socket_.set_option(option);
        start_receive(); 
    }

    void handle_receive_from(const boost::system::error_code& error,
        size_t bytes_recvd)
    {
        if (!error && bytes_recvd > 0)
        {
           if(sender_endpoint_ == <desired_IP_here>) 
               messages_.push(data_);
        } 
        start_receive();
    }

private: 
    boost::asio::io_service& io_service_; 
    udp::socket socket_;
    udp::endpoint sender_endpoint_;
    enum { max_length = 256}; 
    boost::array < boost::uint32_t, max_length > data_; 
    std::queue<boost::array<boost::uint32_t, max_length> messages_; 

    void start_receive()
    {
        socket_.async_receive_from(
            boost::asio::buffer(data_, (sizeof(boost::uint32_t)*max_length)),
            sender_endpoint_,
            boost::bind(&server::handle_receive_from, this,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));

    }
};

Почти забыл - основная функция!

int main(void) 
{
    boost::asio::io_service io_service;
    int port_rx = 0;


    using namespace std;
    server rx(io_service, port_rx);
    io_service.run();

    return 0;
}

Надеюсь, это поможет!

...