nameclient.cpp
来自「一个语言识别引擎」· C++ 代码 · 共 282 行
CPP
282 行
// -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-
/*
* Copyright (C) 2006 Paul Fitzpatrick
* CopyPolicy: Released under the terms of the GNU GPL v2.0.
*
*/
#include <yarp/NameClient.h>
#include <yarp/Logger.h>
#include <yarp/TcpFace.h>
#include <yarp/NetType.h>
#include <yarp/NameServer.h>
#include <yarp/NameConfig.h>
#include <yarp/FallbackNameClient.h>
using namespace yarp;
/**
* The NameClient singleton
*/
NameClient *NameClient::instance = NULL;
/*
Old class for splitting string based on spaces
*/
#define MAX_ARG_CT (20)
#define MAX_ARG_LEN (256)
#ifndef DOXYGEN_SHOULD_SKIP_THIS
class Params {
private:
int argc;
const char *argv[MAX_ARG_CT];
char buf[MAX_ARG_CT][MAX_ARG_LEN];
public:
Params() {
argc = 0;
}
Params(const char *command) {
apply(command);
}
int size() {
return argc;
}
const char *get(int idx) {
return buf[idx];
}
void apply(const char *command) {
int at = 0;
int sub_at = 0;
unsigned int i;
for (i=0; i<strlen(command)+1; i++) {
if (at<MAX_ARG_CT) {
char ch = command[i];
if (ch>=32||ch=='\0'||ch=='\n') {
if (ch==' '||ch=='\n') {
ch = '\0';
}
if (sub_at<MAX_ARG_LEN) {
buf[at][sub_at] = ch;
sub_at++;
}
}
if (ch == '\0') {
if (sub_at>1) {
at++;
}
sub_at = 0;
}
}
}
for (i=0; i<MAX_ARG_CT; i++) {
argv[i] = buf[i];
buf[i][MAX_ARG_LEN-1] = '\0';
}
argc = at;
}
};
#endif /*DOXYGEN_SHOULD_SKIP_THIS*/
Address NameClient::extractAddress(const String& txt) {
Address result;
Params p(txt.c_str());
if (p.size()>=9) {
// registration name /bozo ip 5.255.112.225 port 10002 type tcp
const char *regName = p.get(2);
const char *ip = p.get(4);
int port = atoi(p.get(6));
const char *carrier = p.get(8);
result = Address(ip,port,carrier,regName);
}
return result;
}
String NameClient::send(const String& cmd, bool multi) {
bool retried = false;
bool retry = false;
String result;
do {
YARP_DEBUG(Logger::get(),String("sending to nameserver: ") + cmd);
if (isFakeMode()) {
YARP_DEBUG(Logger::get(),"fake mode nameserver");
return getServer().apply(cmd,Address("localhost",10000,"tcp")) + "\n";
}
TcpFace face;
YARP_DEBUG(Logger::get(),String("connecting to ") + getAddress().toString());
OutputProtocol *ip = NULL;
if (!retry) {
ip = face.write(getAddress());
} else {
retried = true;
}
if (ip==NULL) {
YARP_INFO(Logger::get(),"no connection to nameserver");
Address alt;
if (!isFakeMode()) {
YARP_INFO(Logger::get(),"no connection to nameserver, scanning mcast");
alt = FallbackNameClient::seek();
}
if (alt.isValid()) {
NameConfig nc;
nc.setAddress(alt);
nc.toFile();
address = alt;
ip = face.write(getAddress());
if (ip==NULL) {
YARP_ERROR(Logger::get(),
"no connection to nameserver, scanning mcast");
return "";
}
} else {
return "";
}
}
String cmdn = cmd + "\n";
Bytes b((char*)cmdn.c_str(),cmdn.length());
ip->getOutputStream().write(b);
bool more = multi;
while (more) {
String line = "";
try {
line = NetType::readLine(ip->getInputStream());
} catch (IOException e) {
more = false;
YARP_DEBUG(Logger::get(), e.toString() + " <<< exception from name server");
retry = true;
break;
}
if (line.length()>1) {
if (line[0] == '*') {
more = false;
}
}
result += line + "\n";
}
ip->close();
delete ip;
ACE_DEBUG((LM_DEBUG,"<<< received from nameserver: %s",result.c_str()));
} while (retry&&!retried);
return result;
}
Address NameClient::queryName(const String& name) {
String np = getNamePart(name);
//if (isFakeMode()) {
//return getServer().queryName(np);
//}
String q("NAME_SERVER query ");
q += np;
return probe(q);
}
Address NameClient::registerName(const String& name) {
return registerName(name,Address());
}
Address NameClient::registerName(const String& name, const Address& suggest) {
String np = getNamePart(name);
//if (isFakeMode()) {
//return getServer().registerName(np,suggest);
//}
String q("NAME_SERVER register ");
q += (np!="")?np:"...";
if (suggest.isValid()) {
q += " ";
q += (suggest.getCarrierName()!="")?suggest.getCarrierName():"...";
q += " ";
q += (suggest.getName()!="")?suggest.getName():"...";
q += " ";
if (suggest.getPort()==0) {
q += "...";
} else {
q += NetType::toString(suggest.getPort());
}
}
Address address = probe(q);
if (address.isValid()) {
String reg = address.getRegName();
send(String("NAME_SERVER set ") + reg + " offers tcp text text_ack udp mcast shmem",
false);
send(String("NAME_SERVER set ") + reg + " accepts tcp text text_ack udp mcast shmem",
false);
String ips = NameConfig::getIps();
send(String("NAME_SERVER set ") + reg + " ips " + ips,
false);
send(String("NAME_SERVER set ") + reg + " process " + process,
false);
}
return address;
}
Address NameClient::unregisterName(const String& name) {
String np = getNamePart(name);
//if (isFakeMode()) {
//return getServer().unregisterName(np);
//}
String q("NAME_SERVER unregister ");
q += np;
return probe(q);
}
NameClient::~NameClient() {
if (fakeServer!=NULL) {
delete fakeServer;
fakeServer = NULL;
}
}
NameServer& NameClient::getServer() {
if (fakeServer==NULL) {
fakeServer = new NameServer;
}
YARP_ASSERT(fakeServer!=NULL);
return *fakeServer;
}
NameClient::NameClient() {
NameConfig conf;
address = Address();
process = NetType::toString(ACE_OS::getpid());
if (conf.fromFile()) {
address = conf.getAddress();
} else {
YARP_ERROR(Logger::get(),"Cannot find name server");
//address = Address("localhost",10000);
}
YARP_DEBUG(Logger::get(),String("name server address is ") +
address.toString());
fake = false;
fakeServer = NULL;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?