2011-12-13 76 views
0

我使用boost::asio捕獲udp端口上的數據包。我只是新的提升。 我怎樣才能讓async_receive_from複製數據緩衝只有指定源IP的數據包?boost async_receive_from ip filter

+0

您可以使用asio來捕獲*數據包?這是我的新聞.. – Nim

回答

2

根據你的意思捕獲數據包,這樣的一些代碼將工作。這是從Boost Asio異步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; 
} 

希望這會有所幫助!

相關問題