0
我使用boost::asio
捕獲udp端口上的數據包。我只是新的提升。 我怎樣才能讓async_receive_from
複製數據緩衝只有指定源IP的數據包?boost async_receive_from ip filter
我使用boost::asio
捕獲udp端口上的數據包。我只是新的提升。 我怎樣才能讓async_receive_from
複製數據緩衝只有指定源IP的數據包?boost async_receive_from ip filter
根據你的意思捕獲數據包,這樣的一些代碼將工作。這是從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;
}
希望這會有所幫助!
您可以使用asio來捕獲*數據包?這是我的新聞.. – Nim