#include "ReliableStream.h" #include #include #include #include #include class Forwarder : public Stream { public: std::string prefix; Forwarder *other; std::vector> packets; virtual void write(const void* p, size_t n) { std::cout << prefix << ": "; for(size_t i = 0; i < n; i++) std::cout << std::hex << std::setfill('0') << std::setw(2) << (int) ((uint8_t*)p)[i] << " "; std::cout << std::endl; other->enqueueReceive(p,n); } void enqueueReceive(const void* p, size_t n) { packets.emplace_back((const uint8_t*)p, ((const uint8_t*)p)+n); } void idle() { std::vector> packets2; packets2.swap(packets); for(auto& p : packets2) notifyReceive(p.data(), p.size()); } }; class DumpToConsole : public StreamListener { public: std::string prefix; DumpToConsole(std::string prefix) : prefix(prefix) {} size_t onReceive(const uint8_t* p, size_t n) { std::cout << prefix; for(size_t i = 0; i < n; i++) { if(p[i] >= 128 || p[i] < 32) std::cout << "\\x" << std::hex << (unsigned)p[i]; else std::cout << p[i]; } std::cout << std::endl; return n; } }; int main() { Forwarder fwd1, fwd2; fwd1.other = &fwd2; fwd2.other = &fwd1; fwd1.prefix = "1->2"; fwd2.prefix = "2->1"; ReliableStream rel1(&fwd1), rel2(&fwd2); DumpToConsole dump1("one:"); DumpToConsole dump2("two:"); rel1.setListener(&dump1); rel2.setListener(&dump2); rel1.write("Hello, world.", 13); rel1.flushWrite(); for(int i = 0; i < 10; i++) { std::cout << "handle 1:\n"; fwd1.idle(); std::cout << "handle 2:\n"; fwd2.idle(); } return 0; }