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.