terminator.cpp
来自「一个语言识别引擎」· C++ 代码 · 共 115 行
CPP
115 行
// -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-
/*
* Copyright (C) 2006 Giorgio Metta
* CopyPolicy: Released under the terms of the GNU GPL v2.0.
*
*/
#include <ace/config.h>
#include <ace/OS.h>
#include <ace/Log_Msg.h>
#include <yarp/Address.h>
#include <yarp/SocketTwoWayStream.h>
#include <yarp/NameClient.h>
#include <yarp/os/Terminator.h>
using namespace yarp;
using namespace yarp::os;
bool Terminator::terminateByName(const char *name) {
if (name == NULL)
return false;
String s(name);
if (name[0] != '/') {
s.clear();
s += "/";
s += name;
}
NameClient& namer = NameClient::getNameClient();
Address a = namer.queryName(s);
//ACE_OS::printf("address: %s port %d\n",a.getName().c_str(),a.getPort());
SocketTwoWayStream sock;
sock.open(a);
sock.write(Bytes("quit",4));
sock.close();
return true;
}
class TermineeHelper {
public:
ACE_INET_Addr addr;
ACE_SOCK_Acceptor acceptor;
SocketTwoWayStream sock;
char data[4];
};
#define HELPER(x) (*((TermineeHelper*)(x)))
Terminee::Terminee(const char *name) {
ok = false;
if (name == NULL) {
ACE_OS::printf("Terminator: Please supply a proper port name\n");
return;
}
String s(name);
if (name[0] != '/') {
s.clear();
s += "/";
s += name;
}
NameClient& namer = NameClient::getNameClient();
Address a = namer.registerName(s);
//ACE_OS::printf("listening address: %s port %d\n",a.getName().c_str(),a.getPort());
implementation = new TermineeHelper;
YARP_ASSERT(implementation!=NULL);
TermineeHelper& helper = HELPER(implementation);
helper.addr.set(a.getPort());
helper.acceptor.open(helper.addr, 1);
quit = false;
start();
ok = true;
}
Terminee::~Terminee() {
TermineeHelper& helper = HELPER(implementation);
helper.sock.interrupt();
helper.acceptor.close();
stop();
if (implementation!=NULL) {
delete &HELPER(implementation);
}
}
void Terminee::run() {
TermineeHelper& helper = HELPER(implementation);
while (!isStopping() && !quit) {
helper.sock.open(helper.acceptor);
Address a = helper.sock.getRemoteAddress();
//ACE_OS::printf("incoming data: %s %d\n", a.getName().c_str(), a.getPort());
helper.sock.read(Bytes(helper.data,4));
if (helper.data[0] == 'q' &&
helper.data[1] == 'u' &&
helper.data[2] == 'i' &&
helper.data[3] == 't') {
quit = true;
helper.sock.interrupt();
helper.acceptor.close();
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?