598 zap[
'Q'] =
make_field(JClient::QUEUE_LIMIT) = 100;
604 catch(
const exception &error) {
605 FATAL(error.what() << endl);
609 JServerSocket server(port, backlog);
611 JClientList clientList;
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()) {
630 if (
client->out.isReset()) {
632 if (!
client->queue.empty()) {
637 client->decrementRequest();
642 }
else if (
client->out.isBusy()) {
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(); ) {
668 catch(
const exception& error) {
670 ERROR(
"Remove (3) client" << *
client <<
"<" <<
client->getNickname() <<
">: " << error.what() << endl);
672 if (
client->getNickname() !=
"") {
683 DEBUG(
"Client" << *
client <<
".read" << static_cast<const JSocketInputBuffer&>(
client->in) << endl);
686 if (
client->in.isReady()) {
690 bool special = JControlHost::maybe_special(
client->in.prefix);
698 client->setSubscription(
string(
client->in.getRemainingData(),
client->in.getRemainingSize()));
702 client->setNickname(
string(
client->in.getRemainingData(),
client->in.getRemainingSize()));
708 client->incrementRequest();
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();
725 JControlHost socket(*
client);
727 socket.PutFullString(
DISPTAG_WhereIs, buffer.substr(buffer.empty() ? 0 : 1));
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;
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);
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() !=
"") {
822 if (
select.hasReaderMask(server)) {
824 JTCPSocket socket(server.getFileDescriptor());
829 socket.setReuseAddress(
true);
830 socket.setKeepAlive (
true);
831 socket.setNonBlocking (
true);
833 DEBUG(
"New client" << socket << endl);
835 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.
bool select(const Trk &trk, const Evt &evt)
Event selection.
static const JTag DISPTAG_Died("Died")
static const JTag DISPTAG_MyId("_MyId")
static const JTag DISPTAG_WhereIs("_WhereIs")
then echo Test string reversed by client(hit< return > to continue)." $DIR/JProcess -c "$DIR/JEcho-r" -C fi if (( 1 ))
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
static const size_t buffer_size
static const JTag DISPTAG_Born("Born")
static const long long int GIGABYTE
Number of bytes in a mega-byte.
unsigned long long int getRAM()
Get RAM of this CPU.
static const JTag DISPTAG_Gime("_Gime")
static const JTag DISPTAG_Debug("_Debug")
static const JTag DISPTAG_Always("_Always")
static const JTag DISPTAG_ShowStat("_ShowSta")
#define DEBUG(A)
Message macros.