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