|
PLearn 0.1
|
#include <ServerCommand.h>


Public Member Functions | |
| ServerCommand () | |
| virtual void | run (const std::vector< std::string > &args) |
| The actual implementation of the 'ServerCommand' command. | |
Static Protected Attributes | |
| static PLearnCommandRegistry | reg_ |
| This allows to register the 'ServerCommand' command in the command registry. | |
Definition at line 52 of file ServerCommand.h.
| PLearn::ServerCommand::ServerCommand | ( | ) |
Definition at line 71 of file ServerCommand.cc.
:
PLearnCommand("server",
"Launches plearn in computation server mode",
"server\n"
" Launches plearn in stdin/stdout server mode, \n"
" listening for commands on standard in \n"
" and outputing results on standard out. \n"
" \n"
"server <tcp_port> [<outfile>] [-singleuse]\n"
" Launches plearn in TCP server mode \n"
" Will then print a line to outfile or to stdout (if no outfile is specified) of the form: \n"
" PLEARN_SERVER_TCP hostname port pid\n"
" Will then wait for a connection on the given TCP port. \n"
" All i/o for commands are then done through that connection. \n"
" If you specify -singleuse, then the server will exit when the conneciton \n"
" with its first client is closed or lost."
)
{}
| void PLearn::ServerCommand::run | ( | const std::vector< std::string > & | args | ) | [virtual] |
The actual implementation of the 'ServerCommand' command.
***///***
***///***
Implements PLearn::PLearnCommand.
Definition at line 93 of file ServerCommand.cc.
References PLearn::endl(), PLearn::PStream::flush(), PLearn::get_pio(), PLearn::getPrErrorString(), NORMAL_LOG, PLearn::openFile(), PLearn::perr, PLearn::PStream::plearn_ascii, PLERROR, PLearn::pout, PLearn::PStream::raw_ascii, PLearn::PLearnServer::run(), PLearn::PStream::setMode(), PLearn::toint(), and PLearn::tostring().
{
if(args.size()>0) // Start TCP server on given port
{
PRStatus st;
char buf[256];
int port = toint(args[0]);
bool singleuse=false;
string outfile;
if(args.size()>1)
{
if(args[1]=="-singleuse")
singleuse = true;
else
outfile = args[1];
if(args.size()>2 && args[2]=="-singleuse")
singleuse = true;
}
PRFileDesc* sock = PR_NewTCPSocket();
if (!sock)
PLERROR("Servercommand: socket creation failed! (Maybe you ran out of file descriptors?)");
PRNetAddr server_address;
PR_InitializeNetAddr(PR_IpAddrAny, port, &server_address);
if (PR_Bind(sock, &server_address) != PR_SUCCESS)
PLERROR("ServerCommand: could not bind to port %d!", port);
// Allow reuse of the socket immediately after the server shuts down
PRSocketOptionData socket_option_data;
socket_option_data.option = PR_SockOpt_Reuseaddr;
socket_option_data.value.reuse_addr = PR_TRUE;
PR_SetSocketOption(sock, &socket_option_data);
string myhostname = "UNKNOWN_HOSTNAME";
string mypid = "UNKNOWN_PID";
#ifndef WIN32
mypid = tostring(getpid());
if(gethostname(buf, sizeof(buf))==0)
myhostname = buf;
#endif
PRNetAddr assigned_addr;
PR_InitializeNetAddr(PR_IpAddrAny, PR_htons(0), &assigned_addr);
st= PR_GetSockName(sock, &assigned_addr);
if(port==0 && st==PR_SUCCESS)
port= PR_ntohs(assigned_addr.inet.port);
if(outfile.size()>0)
{
string tmpoutfile =outfile+".tmp";
PStream out = openFile(tmpoutfile, PStream::raw_ascii, "w");
out << "PLEARN_SERVER_TCP " << myhostname << " " << port << " " << mypid << endl;
out = 0; // close it
PR_Rename(tmpoutfile.c_str(), outfile.c_str());
}
else
pout << "PLEARN_SERVER_TCP " << myhostname << " " << port << " " << mypid << endl;
NORMAL_LOG << "PLEARN_SERVER STARTING IN TCP MODE ON " << myhostname << ", PORT " << port << ", PID " << mypid << endl;
NORMAL_LOG << "singleuse = " << singleuse << endl;
bool running = true;
do {
NORMAL_LOG << "\nPLEARN_SERVER WAITING FOR CONNECTION" << endl;
pout << " JBL " << endl;
st = PR_Listen(sock,0);
if(st!=PR_SUCCESS)
PLERROR("serverCommand: listen on socket failed");
PRNetAddr addr;
PRFileDesc* fd = PR_Accept(sock, &addr, PR_INTERVAL_NO_TIMEOUT);
if(fd==0)
PLERROR("ServerCommand: accept returned 0, error code is: %d : %s",
PR_GetError(), getPrErrorString().c_str());
st = PR_NetAddrToString(&addr, buf, sizeof(buf));
NORMAL_LOG << "PLEARN_SERVER CONNECTION_FROM " << buf << endl;
PStream io(new PrPStreamBuf(fd,fd,true,true));
PLearnServer server(io);
running = server.run();
io.flush();
if (PR_Close(fd) != PR_SUCCESS)
PLERROR("ServerCommand: couldn't close client socket from %s!", buf);
} while(running && !singleuse);
NORMAL_LOG << "PLEARN_SERVER CLOSING SOCKET" << endl;
if (PR_Shutdown(sock, PR_SHUTDOWN_BOTH) != PR_SUCCESS)
PLERROR("ServerCommand: couldn't shutdown socket %d!", port);
if (PR_Close(sock) != PR_SUCCESS)
PLERROR("ServerCommand: couldn't close port %d!", port);
}
else // Start stdin/stdout server
{
perr << "Type !? to get some help." << endl;
// PStream io(&std::cin, &std::cout);
// PStream io(new StdPStreamBuf(&std::cin,&std::cout));
// PStream io(new FdPStreamBuf(0,1));
PStream io = get_pio();
io.setMode(PStream::plearn_ascii);
PLearnServer server(io);
server.run();
}
}

PLearnCommandRegistry PLearn::ServerCommand::reg_ [static, protected] |
This allows to register the 'ServerCommand' command in the command registry.
Definition at line 59 of file ServerCommand.h.
1.7.4