gpt4 book ai didi

c++ - 提升 async_receive_from ip 过滤器

转载 作者:行者123 更新时间:2023-11-28 03:43:07 24 4
gpt4 key购买 nike

我正在使用 boost::asio 来捕获 udp 端口​​上的数据包。我只是新来的。如何使 async_receive_from 复制数据以仅缓冲具有指定源 ip 的数据包?

最佳答案

根据您所说的捕获数据包的含义,像这样的一些代码是可行的。这是从 Boost Asio Async UDP 示例修改而来的。如果将端口设置为 0,socket_ 将连接到指定端口 的本地接口(interface),我相信它会监听所有端口。

一旦你使用 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));

}
};

差点忘了 - main 函数!

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;
}

希望这对您有所帮助!

关于c++ - 提升 async_receive_from ip 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8488443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com