这是一个基于boost asio 示例的 boost::asio udp echo 演示。
这个版本使用 C++ lambda 的内容不到 boost 示例大小的一半,但 gcc 告诉我这received
在recv_from
.
不得不以更冗长的方式写这个让我很痛苦。一些 C++ 大师可以帮助我定义相互递归的 lambda 表达式吗?
class server {
public:
server(io_service& io_service, short port)
: socket_(io_service, udp::endpoint(udp::v4(), port)) {
auto recv_from = [&,received]() {
socket_.async_receive_from(buffer(data_, max_length), sender_endpoint_,
received);
};
auto received = [&,recv_from](const error_code& error, size_t bytes_transferred) {
if (!error && bytes_transferred > 0) {
socket_.async_send_to(buffer(data_, bytes_transferred), sender_endpoint_,
[&](const error_code&, size_t) {
recv_from();
});
} else {
recv_from(); // loop
}
};
recv_from();
}
private:
udp::socket socket_;
udp::endpoint sender_endpoint_;
enum { max_length = 1024 };
char data_[max_length];
};
编辑,解决方案:我需要添加这个:
std::function<void(const error_code&, size_t)> received;
使类型推理引擎更容易(我已经为 Haskell 编程过)
Edit2:存在生命周期问题,因此无法正常工作。