feisty meow concerns codebase 2.140
cromp_server.h
Go to the documentation of this file.
1#ifndef CROMP_SERVER_CLASS
2#define CROMP_SERVER_CLASS
3
4/*****************************************************************************\
5* *
6* Name : cromp_server *
7* Author : Chris Koeritz *
8* *
9* Purpose: *
10* *
11* Services request commands from CROMP clients. Derived objects supply *
12* the specific services that a CROMP server implements by providing a set *
13* of tentacles that handle the requests. These are added directly to the *
14* server's octopus base class. *
15* *
16*******************************************************************************
17* Copyright (c) 2000-$now By Author. This program is free software; you can *
18* redistribute it and/or modify it under the terms of the GNU General Public *
19* License as published by the Free Software Foundation; either version 2 of *
20* the License or (at your option) any later version. This is online at: *
21* http://www.fsf.org/copyleft/gpl.html *
22* Please send any updates to: fred@gruntose.com *
23\*****************************************************************************/
24
25#include "cromp_common.h"
26
27#include <octopus/octopus.h>
28#include <processes/ethread.h>
29#include <timely/time_stamp.h>
31
35
36namespace cromp {
37
38// forward.
39class client_dropping_thread;
40class connection_management_thread;
41class cromp_client_list;
42class cromp_client_record;
43class cromp_security;
44class cromp_transaction;
45
47{
48public:
50 int accepting_threads = DEFAULT_ACCEPTERS(),
51 bool instantaneous = true,
52 int max_per_entity = DEFAULT_MAX_ENTITY_QUEUE);
53 // creates a server that will open servers on the location "where". the
54 // number of connections that can be simultaneously handled is passed in
55 // "accepting_threads". if the "instantaneous" parameter is true, then
56 // any infotons that need to be handled will be passed to the octopus for
57 // immediate handling rather than being handled later on a thread.
58
59 virtual ~cromp_server();
60
61 DEFINE_CLASS_NAME("cromp_server");
62
63 int clients() const; // returns number of active clients.
64
66 // returns an internet_address that should work on any interface that a
67 // host has.
68
70 // returns the network location where this server is supposed to reside,
71 // passed in the constructor.
72
73 bool instantaneous() const { return _instantaneous; }
74 // reports whether this server uses immediate handling or delayed handling.
75
76 bool enabled() const { return _enabled; }
77 // reports whether this server has been cranked up or not yet.
78
80 // this must be called after construction to start up the object before it
81 // will accept client requests. if "encrypt" is on, then packets will
82 // be encrypted and no unencrypted packets will be allowed. if the
83 // "security" is passed as NULL_POINTER, then a default security manager is created
84 // and used. otherwise, the specified "security" object is used and will
85 // _not_ be destroyed when this object goes away.
86
87 void disable_servers();
88 // shuts down the server sockets that this object owns and disables the
89 // operation of this object overall. the next step is destruction.
90
92 // given an "id" that is currently connected, find the network address
93 // where it originated and put it in "found". true is returned if the
94 // entity was located.
95
98
100 // blasts a command back to the client identified by the _entity member in
101 // the "id". this allows the controlling object of the server object to
102 // asynchronously inject data into the client's incoming stream. the
103 // client had better know what's going on or this will just lead to
104 // ignored data that eventually gets trashed.
105
107 int timeout);
108 // attempts to locate a command with the request "id". if it is found
109 // within the timeout period, then "data" is set to the command. the
110 // "data" pointer must be deleted after use.
111
112// basis::outcome get_any_from_client(const octopi::octopus_entity &ent, octopi::infoton * &data,
113// int timeout);
114 // attempts to grab any waiting package for the entity "ent".
115
116 bool get_sizes(const octopi::octopus_entity &id, int &items, int &bytes);
117 // promoted from our octopus' entity_data_bin in order to provide some
118 // accounting of what is stored for the "id".
119
121 // returns a printout of the responses being held here.
122
123 static int DEFAULT_ACCEPTERS();
124 // the default number of listening threads.
125
126 // internal use only...
127
128 void look_for_clients(processes::ethread &requester);
129 // meant to be called by an arbitrary number of threads that can block
130 // on accepting a new client. control flow will not return from this
131 // method until the thread's cancel() method has been called.
132
133 void drop_dead_clients();
134 // called by a thread to manage dead or dying connections.
135
136 bool encrypting() const { return !!_encrypt_arm; }
137 // true if this object is encrypting transmissions.
138
140 // when we're encrypting, this turns "request" into an encryption_wrapper.
141 // if NULL_POINTER is returned, then nothing needed to happen to the "request".
142
143private:
144 cromp_client_list *_clients; // the active set of clients.
145 processes::thread_cabinet *_accepters; // the list of accepting threads.
146 basis::mutex *_list_lock; // protects our lists.
147 timely::time_stamp *_next_droppage; // times cleanup for dead clients.
148 bool _instantaneous; // true if the octopus gets driven hard.
149 sockets::internet_address *_where; // where does the server live.
150 int _accepting_threads; // the number of accepters we keep going.
151 client_dropping_thread *_dropper; // cleans our lists.
152 bool _enabled; // records if this is running or not.
153 octopi::encryption_tentacle *_encrypt_arm; // the handler for encryption.
154 cromp_security *_default_security; // used in lieu of other provider.
155 octopi::login_tentacle *_security_arm; // handles security for the logins.
156
157 basis::outcome accept_one_client(bool wait);
158 // tries to get just one accepted client. if "wait" is true, then the
159 // routine will pause until the socket accept returns.
160};
161
162} //namespace.
163
164#endif
165
166
Provides a dynamically resizable ASCII character string.
Definition astring.h:35
Outcomes describe the state of completion for an operation.
Definition outcome.h:31
A few common features used by both CROMP clients and servers.
Implements the client registry in a cromp-appropriate manner.
basis::outcome enable_servers(bool encrypt, cromp_security *security=NULL_POINTER)
bool encrypting() const
bool get_sizes(const octopi::octopus_entity &id, int &items, int &bytes)
DEFINE_CLASS_NAME("cromp_server")
octopi::infoton * wrap_infoton(octopi::infoton *&request, const octopi::octopus_entity &ent)
static sockets::internet_address any_address(int port)
basis::outcome send_to_client(const octopi::octopus_request_id &id, octopi::infoton *data)
basis::astring responses_text_form() const
bool instantaneous() const
bool enabled() const
sockets::internet_address location() const
void look_for_clients(processes::ethread &requester)
bool find_entity(const octopi::octopus_entity &id, sockets::internet_address &found)
basis::outcome get_from_client(const octopi::octopus_request_id &id, octopi::infoton *&data, int timeout)
static int DEFAULT_ACCEPTERS()
bool disconnect_entity(const octopi::octopus_entity &id)
returns true if the "id" can be found and disconnected.
Processes the encryption_infoton object for setting up an encrypted channel.
An infoton is an individual request parcel with accompanying information.
Definition infoton.h:32
Provides rudimentary login services.
Provides a way of identifying users of an octopus object.
Definition entity_defs.h:35
Identifies requests made on an octopus by users.
Provides a platform-independent object for adding threads to a program.
Definition ethread.h:36
Manages a collection of threads.
this type of address describes a destination out on the internet.
Represents a point in time relative to the operating system startup time.
Definition time_stamp.h:38
#define NULL_POINTER
The value representing a pointer to nothing.
Definition definitions.h:32
const int DEFAULT_MAX_ENTITY_QUEUE
the default size we allow per each entity.