579int main(
int argc, 
char* argv[])
 
  598    zap[
'Q'] = 
make_field(JClient::QUEUE_LIMIT)    =    100;
 
  604  catch(
const exception &error) {
 
  605    FATAL(error.what() << endl);
 
  614  DEBUG(
"Port         " << setw(10) << port                    << endl);
 
  615  DEBUG(
"Memory limit " << setw(10) << JDispatch::MEMORY_LIMIT << endl);
 
  616  DEBUG(
"Queue  limit " << setw(10) << JClient::QUEUE_LIMIT    << endl);
 
  622    select.setReaderMask(server);
 
  624    for (JClientList::iterator client = clientList.begin(); client != clientList.end(); ++client) {
 
  626      if (!client->in.isReady()) {
 
  627        select.setReaderMask(*client);
 
  630      if (client->out.isReset()) {
 
  632        if (!client->queue.empty()) {
 
  634          DEBUG(
"Client" << *client << 
".set" << client->queue.front() << endl);
 
  636          client->out.set(client->queue.front());
 
  637          client->decrementRequest();
 
  639          select.setWriterMask(*client);
 
  642      } 
else if (client->out.isBusy()) {
 
  644        select.setWriterMask(*client);
 
  651      nfds = select(timeout_us);
 
  653    catch(
const exception& error) {
 
  654      ERROR(
"" << error.what() << endl);
 
  659      for (JClientList::iterator client = clientList.begin(); client != clientList.end(); ) {
 
  663          if (select.hasReaderMask(*client)) {
 
  668            catch(
const exception& error) {
 
  670              ERROR(
"Remove (3) client" << *client << 
"<" << client->getNickname() << 
">: " << error.what() << endl);
 
  672              if (client->getNickname() != 
"") {
 
  673                clientList.
add(
JDispatch(DISPTAG_Died, client->getNickname()));
 
  678              client = clientList.erase(client);
 
  686          if (client->in.isReady()) {
 
  688            DEBUG(
"Message" << *client << 
' ' << client->in.prefix.c_str() << 
' ' << client->in.size() << endl);
 
  690            bool special = JControlHost::maybe_special(client->in.prefix);
 
  696              if        (client->in.prefix.getTag() == DISPTAG_Subscribe) {
 
  698                client->setSubscription(
string(client->in.getRemainingData(), client->in.getRemainingSize()));
 
  700              } 
else if (client->in.prefix.getTag() == DISPTAG_MyId) {
 
  702                client->setNickname(
string(client->in.getRemainingData(), client->in.getRemainingSize()));
 
  704                clientList.
add(
JDispatch(DISPTAG_Born, client->getNickname()));
 
  706              } 
else if (client->in.prefix.getTag() == DISPTAG_Gime) {
 
  708                client->incrementRequest();
 
  710              } 
else if (client->in.prefix.getTag() == DISPTAG_Always) {
 
  712                client->setRequestAll();
 
  714              } 
else if (client->in.prefix.getTag() == DISPTAG_WhereIs) {
 
  716                string nick_name(client->in.getRemainingData(), client->in.getRemainingSize());
 
  719                for (JClientList::iterator i = clientList.begin(); i != clientList.end(); ++i) {
 
  720                  if (i->getNickname() == nick_name) {
 
  721                    buffer += 
" " + i->getHostname();
 
  727                socket.
PutFullString(DISPTAG_WhereIs, buffer.substr(buffer.empty() ? 0 : 1));
 
  729                DEBUG(
"Remove (1) client" << *client << endl);
 
  733                client = clientList.erase(client);
 
  737              } 
else if (client->in.prefix.getTag() == DISPTAG_ShowStat) {
 
  741                client = clientList.erase(client);
 
  743                for (JClientList::iterator i = clientList.begin(); i != clientList.end(); ++i) {
 
  747                  for (std::deque<JDispatch>::const_iterator message = i->queue.begin(); message != i->queue.end(); ++message) {
 
  748                    total += message->size();
 
  751                  cout << 
"client[" << i->getFileDescriptor() << 
"] " << i->getNickname() << endl;
 
  752                  cout << 
"tag - all:";
 
  757                  cout << 
"tag - any:";
 
  762                  cout << 
"queue " << i->queue.size() << 
' ' << total << 
"B" << endl;
 
  767              } 
else if (client->in.prefix.getTag() == DISPTAG_Debug) {
 
  769                istringstream is(
string(client->in.getRemainingData(), client->in.getRemainingSize()));
 
  781              clientList.
add(
JDispatch(client->in.prefix, client->in.data()));
 
  783              if (JDispatch::MEMORY_TOTAL > JDispatch::MEMORY_LIMIT) {
 
  785                WARNING(
"Memory " << setw(10) << JDispatch::MEMORY_TOTAL << 
" > " << setw(10) << JDispatch::MEMORY_LIMIT << endl);
 
  794          if (select.hasWriterMask(*client)) {
 
  798            DEBUG(
"Client" << *client << 
".write" << 
static_cast<const JSocketStatus&
>(client->out) << endl);
 
  800            if (client->out.isReady()) {
 
  802              client->queue.pop_front();
 
  808        catch(
const exception& error) {
 
  810          DEBUG(
"Remove (2) client" << *client << 
"<" << client->getNickname() << 
">: " << error.what() << endl);
 
  812          if (client->getNickname() != 
"") {
 
  813            clientList.
add(
JDispatch(DISPTAG_Died, client->getNickname()));
 
  818          client = clientList.erase(client);
 
  822      if (select.hasReaderMask(server)) {
 
  833        DEBUG(
"New client" << socket << endl);
 
  835        clientList.push_back(
JClient(socket));