// Copyright (c) 2001 David Muse
// See the file COPYING for more information
#include <rudiments/daemonprocess.h>
#include <rudiments/permissions.h>
#include <rudiments/inetserversocket.h>
#include <rudiments/charstring.h>
#include <rudiments/file.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef RUDIMENTS_NAMESPACE
using namespace rudiments;
#endif
uint32_t buffersize;
class myserver : public daemonprocess, public inetserversocket {
public:
myserver() : daemonprocess(), inetserversocket() {}
void listen();
};
void myserver::listen() {
// make sure that only one instance is running
int pid=checkForPidFile("/tmp/svr.pidfile");
if (pid>-1) {
printf("Sorry, an instance of this server is already running with process id: %d\n",pid);
return;
}
// detach from the controlling terminal
//detach();
// create a pid file which is used to make sure that only one instance
// is running and can also be used to kill the process
createPidFile("/tmp/svr.pidfile",permissions::ownerReadWrite());
// listen on inet socket port 8000
if (!inetserversocket::listen(NULL,8000,15)) {
printf("couldn't listen on port 8000\n");
}
// loop...
for (;;) {
// accept a client connection
filedescriptor *clientsock=accept();
clientsock->allowShortReads();
clientsock->setReadBufferSize(buffersize);
// read from the client
unsigned char buffer;
while (clientsock->read(&buffer)>0) {}
// close the socket and clean up
clientsock->close();
delete clientsock;
}
}
myserver *mysvr;
// define a function to shut down the process cleanly
RETSIGTYPE shutDown() {
printf("shutting down\n");
mysvr->close();
delete mysvr;
file::remove("/tmp/svr.pidfile");
exit(0);
}
int main(int argc, const char **argv) {
if (argc<2) {
printf("usage: inetsvrbench [buffer size]\n");
exit(1);
}
buffersize=charstring::toUnsignedInteger(argv[1]);
mysvr=new myserver();
// set up signal handlers for clean shutdown
mysvr->handleShutDown((RETSIGTYPE *)shutDown);
mysvr->handleCrash((RETSIGTYPE *)shutDown);
mysvr->listen();
}
syntax highlighted by Code2HTML, v. 0.9.1