Listing 3: A logging example using CommsChannel
#include <iostream.h> #include "channel.hpp" #include <string.h> #define LOG_BUFFER 255 class LogServer { public: LogServer(); void run(); private: CommsChannel server; bool ok; }; class Logger { public: Logger(); void log(string message); private: CommsChannel client; bool ok; }; // Log server implementation LogServer::LogServer () : server("ExampleLogger", LOG_BUFFER) { if ( server.status() == CommsChannel::ok ) { ok = true; } else { ok = false; cout << "CommsChannel could not be opened." << endl; } } void LogServer::run() { char buffer[LOG_BUFFER+1]; int bytes; char pause; cout << "Log server started" << endl; while (ok) { bytes = server.readBlocking(buffer, 1); if (bytes == 1) { bytes = buffer[0]; bytes = server.readBlocking(buffer, bytes); if (bytes > 0) { buffer[bytes] = '\0'; cout << buffer << endl; } cin >> pause; } if (server.status() != CommsChannel::ok) { ok = false; } } cout << "Log server stopping. Last status was: "; cout << server.status() << endl; } // Log client implementation Logger::Logger () : client("ExampleLogger") { if ( client.status() == CommsChannel::ok ) { ok = true; } else { ok = false; cout << "CommsChannel could not be opened." << endl; } } void Logger::log(string word) { char buffer[LOG_BUFFER+1]; int bytes = word.length(); if (bytes-2 > LOG_BUFFER) { cout << "Error while logging. Data too long" << endl; } buffer[0] = bytes; strcpy(&buffer[1], word.c_str()); if (client.writeBlocking(buffer, bytes+2) < 0) { cout << "Error while logging. Last status was: "; cout << client.status() << endl; } } // Testing - run with an argument in one process for a server, // without an argument in another process as the client void main(int argc) { if (argc > 1) { // server LogServer s; s.run(); } else { // client string word; Logger l; while(true) { cout << "Log word: "; cin >> word; l.log(word); } } } //End of File