#include "nmmsender.hh" #include "comboaddress.hh" #include "swrappers.hh" #include "sclasses.hh" #include #include "navmon.hh" #include using namespace std; void NMMSender::sendTCPThread(Destination* d) { struct NameError{}; for(;;) { ComboAddress chosen; try { vector addrs; for(;;) { addrs=resolveName(d->dst, true, true); if(!addrs.empty()) break; cerr<dst<<", sleeping and trying again later"<dst<<" on "< mut(d->mut); if(!d->queue.empty()) { msg = d->queue.front(); } } if(!msg.empty()) { sc.writen(msg); std::lock_guard mut(d->mut); d->queue.pop_front(); } else usleep(100000); } } } catch(NameError&) { { std::lock_guard mut(d->mut); if (d_debug) { cerr<queue.size()<<" messages queued for "<dst<dst<<" via "< mut(d->mut); if (d_debug) { cerr<queue.size()<<" messages queued for "<dst<dst <<" via "< mut(d->mut); if (d_debug) { cerr<<"There are now "<queue.size()<<" messages queued for "<dst<<" via "<emitNMM(nmm); } } void NMMSender::Destination::emitNMM(const NavMonMessage& nmm) { string out; nmm.SerializeToString(& out); string msg("bert"); uint16_t len = htons(out.size()); msg.append((char*)&len, 2); msg.append(out); if(!dst.empty()) { std::lock_guard l(mut); queue.push_back(msg); } else writen2(fd, msg.c_str(), msg.size()); }