Skip to main content

RawServer

The RawServer and RawSession classes provide a minimal yet powerful framework for implementing custom socket-based servers.

  • RawServer: A base class for a multithreaded TCP server that accepts incoming Socket connections and spawns dedicated RawSession instances for each client.

  • RawSession: An abstract base class representing a single client connection. It encapsulates a Socket and provides interfaces for reading and writing data, with support for per-session timeouts and custom handling logic.

#include <network/rawserver/include/TellusimRawServer.h>

Example

The example below demonstrates how to use this framework to build a simple echo server that logs client requests and returns modified responses.

// Custom Session class
class Session : public RawSession {

public:

Session(Socket &socket) : RawSession(socket) { }

virtual bool read() {

// read request
String request = socket.readString();
TS_LOGF(Message, "String::read(): request: %s\n", request.get());

// write response
String response = request + " " + String::fromBytes(request.size());
socket.writeString(response);

return true;
}
};
// Custom Server class
class Server : public RawServer {

public:

Server() { }

private:

virtual RawSession *create_session(Socket &socket) {
return new Session(socket);
}
};
// create server
Server server;

// server timeout
server.setTimeout(1);

// initialize server
if(!server.init(62823)) return false;

// client thread
AutoPtr<Thread> thread = makeAutoPtr(makeThreadFunction([&](Thread *thread) {
Time::sleep(Time::Seconds / 2);
Socket socket;
if(socket.open("localhost", server.getPort()) && socket.connect(2)) {
if(socket.writeString("Hello")) {
TS_LOGF(Message, "%s: response: %s\n", argv[0], socket.readString().get());
}
if(socket.writeString("RawServer")) {
TS_LOGF(Message, "%s: response: %s\n", argv[0], socket.readString().get());
}
}
thread->stop();
server.stop();
}));
if(!thread->run()) return false;

// run the server
if(!server.run()) return false;
String::read(): request: Hello
./maind: response: Hello 5 B

String::read(): request: RawServer
./maind: response: RawServer 9 B