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));