/* ....[@@@..[@@@..............[@.................. MUD++ is a written from ....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and ....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++. ....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing ....[@......[@..[@@@@@..[@@@@@.................. development project. All ................................................ contributions are welcome. ....Copyright(C).1995.Melvin.Smith.............. Enjoy. ------------------------------------------------------------------------------ Melvin Smith (aka Fusion) msmith@falcon.mercer.peachnet.edu MUD++ development mailing list mudpp-list@spice.com ------------------------------------------------------------------------------ server.h */ #include "socket.h" #ifndef SERVER_H #define SERVER_H #define NULL_CHAR '\0' #ifndef NULL #define NULL 0 #endif #ifndef FNDELAY #define FNDELAY O_NONBLOCK #endif #ifndef EWOULDBLOCK #define EWOULDBLOCK EAGAIN #endif // On my old DEC with 4.2 bsd I had to do this. SIG_DFL wont compile #ifdef ultrix #ifdef SIG_IGN #undef SIG_IGN #define SIG_IGN (void*)1 #endif #endif #define SOFT_MAX_DESC 256 // Fuzzy _POSIX_OPEN_MAX, only used for array size #define MAX_READ 256 #define MAX_WRITE 4096 // Dont write more than this in a call class Server { private: Socket *master; int masterport; int masterdesc; int type; int nameserver; int maxdesc; int maxread; int maxidle; int descripts; int topdesc; int bitwidth; timeval null_time; fd_set MASTER_SET, R_SET, W_SET, E_SET; public: Server() : masterport(4000), masterdesc(0) { } Server( int theport = 4000 ) : masterport( theport ), masterdesc(0), type( SOCK_STREAM ), nameserver(0), maxread( MAX_READ ), maxidle(0), descripts(0) { null_time.tv_sec = 0; null_time.tv_usec = 0; maxdesc = sysconf( _SC_OPEN_MAX ); printf( "SERVER: Ok. This OS supports %d open descriptors theoretically.\n", maxdesc ); // Who cares if OS supports 2 mil, realistic is 256 for a MUD if( maxdesc > 256 ) maxdesc = 256; bitwidth = maxdesc / 8; } ~Server(); Socket * getSock(); // return actual socket descriptor value int getPort() { return masterport; } int getDesc() { return masterdesc; } int boot( int tport = 4000 ); // boot on a specific port int boot( int, int ); // reboot ( port and TCP desc ) int newConnection(); void addSock( Socket * ); // Add a previously opened desc. Socket * accept(); int poll(); void sleep( long millisecs ); void useNameServer(); void remove( Socket * ); int error( Socket * ); int canWrite( Socket * ); int canRead( Socket * ); }; #endif