1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
#include "caf/all.hpp"
using namespace caf;
behavior server(event_based_actor* self) {
self->set_default_handler(skip);
return {
[=](idle_atom, const actor& worker) {
self->become(keep_behavior, [=](ping_atom atm) {
self->delegate(worker, atm);
self->unbecome();
});
},
};
}
behavior client(event_based_actor* self, const actor& serv) {
self->link_to(serv);
self->send(serv, idle_atom_v, self);
return {
[=](ping_atom) {
self->send(serv, idle_atom_v, self);
return pong_atom_v;
},
};
}
void caf_main(actor_system& system) {
auto serv = system.spawn(server);
auto worker = system.spawn(client, serv);
scoped_actor self{system};
self->request(serv, std::chrono::seconds(10), ping_atom_v)
.receive(
[&](pong_atom) {
aout(self) << "received response from "
<< (self->current_sender() == worker ? "worker\n"
: "server\n");
},
[&](error& err) {
aout(self) << "received error " << to_string(err) << " from "
<< (self->current_sender() == worker ? "worker\n"
: "server\n");
});
self->send_exit(serv, exit_reason::user_shutdown);
}
CAF_MAIN()
|