예제 #1
0
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;
        }
    }
}
예제 #2
0
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();
            }
        }
    }
}
예제 #3
0
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);
            }
        }
    }

}