void FallbackNameClient::run() { NameConfig nc; Contact call = FallbackNameServer::getAddress(); DgramTwoWayStream send; send.join(call, true); listen.join(call, false); if (!listen.isOk()) { YARP_ERROR(Logger::get(), ConstString("Multicast not available")); return; } ConstString msg = ConstString("NAME_SERVER query ") + nc.getNamespace(); send.beginPacket(); send.writeLine(msg.c_str(), (int)msg.length()); send.flush(); send.endPacket(); for (int i=0; i<5; i++) { listen.beginPacket(); ConstString txt = listen.readLine(); listen.endPacket(); if (closed) return; YARP_DEBUG(Logger::get(), ConstString("Fallback name client got ") + txt); if (txt.find("registration ")==0) { address = NameClient::extractAddress(txt); YARP_INFO(Logger::get(), ConstString("Received address ") + address.toURI()); return; } } }
void FallbackNameServer::run() { DgramTwoWayStream send; send.join(getAddress(),true); listen.join(getAddress(),false); YARP_DEBUG(Logger::get(),"Fallback server running"); while (listen.isOk()&&send.isOk()&&!closed) { YARP_DEBUG(Logger::get(),"Fallback server waiting"); String msg; listen.beginPacket(); msg = listen.readLine(); listen.endPacket(); YARP_DEBUG(Logger::get(),"Fallback server got something"); if (listen.isOk()&&!closed) { YARP_DEBUG(Logger::get(),String("Fallback server got ") + msg); if (msg.find("NAME_SERVER ") == 0) { Contact addr; String result = owner.apply(msg,addr); send.beginPacket(); send.writeLine(result.c_str(),(int)result.length()); send.flush(); send.endPacket(); } } } }
void DgramTwoWayStream::interrupt() { bool act = false; mutex.wait(); if ((!closed) && (!interrupting) && happy) { act = true; interrupting = true; closed = true; } mutex.post(); if (act) { if (reader) { int ct = 3; while (happy && ct>0) { ct--; DgramTwoWayStream tmp; if (mgram) { YARP_DEBUG(Logger::get(), String("* mcast interrupt, interface ") + restrictInterfaceIp.toString().c_str() ); tmp.join(localAddress,true, restrictInterfaceIp); } else { YARP_DEBUG(Logger::get(),"* dgram interrupt"); tmp.open(Contact(localAddress.getHost(),0), localAddress); } YARP_DEBUG(Logger::get(), String("* interrupt state ") + NetType::toString(interrupting) + " " + NetType::toString(closed) + " " + NetType::toString(happy) + " "); ManagedBytes empty(10); for (size_t i=0; i<empty.length(); i++) { empty.get()[i] = 0; } // don't want this message getting into a valid packet tmp.pct = -1; tmp.write(empty.bytes()); tmp.flush(); tmp.close(); if (happy) { yarp::os::Time::delay(0.25); } } YARP_DEBUG(Logger::get(),"dgram interrupt done"); } mutex.wait(); interrupting = false; mutex.post(); } else { // wait for interruption to be done if (interrupting) { while (interrupting) { YARP_DEBUG(Logger::get(), "waiting for dgram interrupt to be finished..."); yarp::os::Time::delay(0.1); } } } }