574     zap[
'Q'] = 
make_field(JClient::QUEUE_LIMIT)    =    100;
 
  580   catch(
const exception &error) {
 
  581     FATAL(error.what() << endl);
 
  585   JServerSocket         server(port, backlog);
 
  587   JClientList           clientList;
 
  590   DEBUG(
"Port         " << setw(10) << port                    << endl);
 
  591   DEBUG(
"Memory limit " << setw(10) << JDispatch::MEMORY_LIMIT << endl);
 
  592   DEBUG(
"Queue  limit " << setw(10) << JClient::QUEUE_LIMIT    << endl);
 
  598     select.setReaderMask(server);
 
  600     for (JClientList::iterator client = clientList.begin(); client != clientList.end(); ++client) {
 
  602       if (!client->in.isReady()) {
 
  603         select.setReaderMask(*client);
 
  606       if (client->out.isReset()) {
 
  608         if (!client->queue.empty()) {
 
  610           DEBUG(
"Client" << *client << 
".set" << client->queue.front() << endl);
 
  612           client->out.set(client->queue.front());
 
  613           client->decrementRequest();
 
  615           select.setWriterMask(*client);
 
  618       } 
else if (client->out.isBusy()) {
 
  620         select.setWriterMask(*client);
 
  624     if (select(timeout_us) > 0) {
 
  626       for (JClientList::iterator client = clientList.begin(); client != clientList.end(); ) {
 
  630           if (select.hasReaderMask(*client)) {
 
  635             catch(
const exception& error) {
 
  637               ERROR(
"Remove (3) client" << *client << 
"<" << client->getNickname() << 
">: " << error.what() << endl);
 
  639               if (client->getNickname() != 
"") {
 
  640                 clientList.add(JDispatch(
DISPTAG_Died, client->getNickname()));
 
  645               client = clientList.erase(client);
 
  650             DEBUG(
"Client" << *client << 
".read" << static_cast<const JSocketInputBuffer&>(client->in) << endl);
 
  653           if (client->in.isReady()) {
 
  655             DEBUG(
"Message" << *client << 
' ' << client->in.prefix.c_str() << 
' ' << client->in.size() << endl);
 
  657             bool special = JControlHost::maybe_special(client->in.prefix);
 
  665                 client->setSubscription(
string(client->in.getRemainingData(), client->in.getRemainingSize()));
 
  667               } 
else if (client->in.prefix.getTag() == 
DISPTAG_MyId) {
 
  669                 client->setNickname(
string(client->in.getRemainingData(), client->in.getRemainingSize()));
 
  671                 clientList.add(JDispatch(
DISPTAG_Born, client->getNickname()));
 
  673               } 
else if (client->in.prefix.getTag() == 
DISPTAG_Gime) {
 
  675                 client->incrementRequest();
 
  679                 client->setRequestAll();
 
  683                 string nick_name(client->in.getRemainingData(), client->in.getRemainingSize());
 
  686                 for (JClientList::iterator i = clientList.begin(); i != clientList.end(); ++i) {
 
  687                   if (i->getNickname() == nick_name) {
 
  688                     buffer += 
" " + i->getHostname();
 
  692                 JControlHost socket(*client);
 
  694                 socket.PutFullString(
DISPTAG_WhereIs, buffer.substr(buffer.empty() ? 0 : 1));
 
  696                 DEBUG(
"Remove (1) client" << *client << endl);
 
  700                 client = clientList.erase(client);
 
  712               clientList.add(JDispatch(client->in.prefix, client->in.data()));
 
  714               if (JDispatch::MEMORY_TOTAL > JDispatch::MEMORY_LIMIT) {
 
  716                 WARNING(
"Memory " << setw(10) << JDispatch::MEMORY_TOTAL << 
" > " << setw(10) << JDispatch::MEMORY_LIMIT << endl);
 
  725           if (select.hasWriterMask(*client)) {
 
  729             DEBUG(
"Client" << *client << 
".write" << static_cast<const JSocketStatus&>(client->out) << endl);
 
  731             if (client->out.isReady()) {
 
  733               client->queue.pop_front();
 
  739         catch(
const exception& error) {
 
  741           DEBUG(
"Remove (2) client" << *client << 
"<" << client->getNickname() << 
">: " << error.what() << endl);
 
  743           if (client->getNickname() != 
"") {
 
  744             clientList.add(JDispatch(
DISPTAG_Died, client->getNickname()));
 
  749           client = clientList.erase(client);
 
  753       if (select.hasReaderMask(server)) {
 
  757         socket.accept(server.getFileDescriptor());
 
  762         socket.setKeepAlive  (
true);
 
  763         socket.setNonBlocking(
true);
 
  765         DEBUG(
"New client" << socket << endl);
 
  767         clientList.push_back(JClient(socket));
 
Utility class to parse command line options. 
 
static const JTag DISPTAG_Subscribe("_Subscri")
Special ControlHost tags. 
 
static const int DISPATCH_PORT
Default ControlHost port. 
 
static const JTag DISPTAG_Died("Died")
 
static const JTag DISPTAG_MyId("_MyId")
 
static const JTag DISPTAG_WhereIs("_WhereIs")
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object 
 
static const size_t buffer_size
 
static const JTag DISPTAG_Born("Born")
 
unsigned long long int getRAM()
Get RAM of this CPU. 
 
static const JTag DISPTAG_Gime("_Gime")
 
static const JTag DISPTAG_Always("_Always")
 
#define DEBUG(A)
Message macros.