bool yarp::os::impl::UdpCarrier::expectReplyToHeader(ConnectionState& proto) { // I am the sender int myPort = proto.getStreams().getLocalAddress().getPort(); ConstString myName = proto.getStreams().getLocalAddress().getHost(); ConstString altName = proto.getStreams().getRemoteAddress().getHost(); int altPort = readYarpInt(proto); if (altPort==-1) { return false; } DgramTwoWayStream *stream = new DgramTwoWayStream(); yAssert(stream!=YARP_NULLPTR); proto.takeStreams(YARP_NULLPTR); // free up port from tcp bool ok = stream->open(Contact(myName,myPort),Contact(altName,altPort)); if (!ok) { delete stream; return false; } proto.takeStreams(stream); return true; }
bool yarp::os::impl::McastCarrier::becomeMcast(ConnectionState& proto, bool sender) { #ifndef YARP_HAS_ACE return false; #else YARP_UNUSED(sender); DgramTwoWayStream *stream = new DgramTwoWayStream(); yAssert(stream!=YARP_NULLPTR); Contact remote = proto.getStreams().getRemoteAddress(); Contact local; local = proto.getStreams().getLocalAddress(); bool test = true; //(yarp::NameConfig::getEnv("YARP_MCAST_TEST")!=""); /* if (test) { printf(" MULTICAST is being extended; some temporary status messages added\n"); printf(" Local: %s\n", local.toString().c_str()); printf(" Remote: %s\n", remote.toString().c_str()); } */ proto.takeStreams(YARP_NULLPTR); // free up port from tcp if (sender) { /* Multicast behavior seems a bit variable. We assume here that if packages need to be broadcast to targets via different network interfaces, that we'll need to send independently on those two interfaces. This may or may not always be the case, the author doesn't know, so is being cautious. */ key = proto.getRoute().getFromName(); if (test) { key += "/net="; key += local.getHost(); } YARP_DEBUG(Logger::get(), ConstString("multicast key: ") + key); addSender(key); } bool ok = true; if (isElect()||!sender) { if (test) { ok = stream->join(mcastAddress,sender,local); } else { ok = stream->join(mcastAddress,sender); } } if (!ok) { delete stream; return false; } proto.takeStreams(stream); return true; #endif }
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(); } } } }
bool yarp::os::impl::UdpCarrier::respondToHeader(ConnectionState& proto) { // I am the receiver // issue: need a fresh port number... DgramTwoWayStream *stream = new DgramTwoWayStream(); yAssert(stream!=YARP_NULLPTR); Contact remote = proto.getStreams().getRemoteAddress(); bool ok = stream->open(remote); if (!ok) { delete stream; return false; } int myPort = stream->getLocalAddress().getPort(); writeYarpInt(myPort,proto); proto.takeStreams(stream); return true; }
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 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); } } } }