diff --git a/server/README.md b/server/README.md index 69084be6f8a48cb3b630086e832d529fff569786..ef2e9fb6749a7cc3385cef5590279494077296b2 100644 --- a/server/README.md +++ b/server/README.md @@ -37,6 +37,7 @@ The following example config file supports two Fadecandy devices with distinct s { "listen": ["127.0.0.1", 7890], + "verbose": true, "color": { "gamma": 2.5, diff --git a/server/fcserver.cpp b/server/fcserver.cpp index 6958ee940e1bb08a1e032c8d3e9df7528b78aaf5..11cf72472fedbfc359f8379fcf17c1ed386bc21e 100644 --- a/server/fcserver.cpp +++ b/server/fcserver.cpp @@ -25,14 +25,16 @@ #include "fcserver.h" #include <netdb.h> #include <ctype.h> +#include <iostream> FCServer::FCServer(rapidjson::Document &config) : mListen(config["listen"]), mColor(config["color"]), mDevices(config["devices"]), + mVerbose(config["verbose"].IsTrue()), mListenAddr(0), - mOPCSink(opcCallback, this) + mOPCSink(opcCallback, this, mVerbose) { /* * Parse the listen [host, port] list. @@ -81,7 +83,6 @@ void FCServer::start(struct ev_loop *loop) mOPCSink.start(loop, mListenAddr); } - void FCServer::opcCallback(OPCSink::Message &msg, void *context) { FCServer *self = static_cast<FCServer*>(context); diff --git a/server/fcserver.h b/server/fcserver.h index d4cd653859223eb6b421d0490a448494a82a8e8a..f942cbf36ec760318df441817398c0d1d4cf80ec 100644 --- a/server/fcserver.h +++ b/server/fcserver.h @@ -48,6 +48,7 @@ private: const Value& mListen; const Value& mColor; const Value& mDevices; + bool mVerbose; struct addrinfo *mListenAddr; OPCSink mOPCSink; diff --git a/server/opcsink.cpp b/server/opcsink.cpp index 11f41735a00e74c2f29a7f6dbeab7a5e8eefcb65..1cebfb0e242b2eaa028796a1cf2b8fecff8418b8 100644 --- a/server/opcsink.cpp +++ b/server/opcsink.cpp @@ -26,10 +26,12 @@ #include <stdio.h> #include <unistd.h> #include <string.h> +#include <arpa/inet.h> +#include <iostream> -OPCSink::OPCSink(callback_t cb, void *context) - : mCallback(cb), mContext(context) {} +OPCSink::OPCSink(callback_t cb, void *context, bool verbose) + : mVerbose(verbose), mCallback(cb), mContext(context) {} void OPCSink::start(struct ev_loop *loop, struct addrinfo *listenAddr) { @@ -52,6 +54,11 @@ void OPCSink::start(struct ev_loop *loop, struct addrinfo *listenAddr) // Get a callback when we're ready to accept a new connection ev_io_init(&mIOAccept, cbAccept, sock, EV_READ); ev_io_start(loop, &mIOAccept); + + if (mVerbose) { + struct sockaddr_in *sin = (struct sockaddr_in*) listenAddr->ai_addr; + std::clog << "Listening on " << inet_ntoa(sin->sin_addr) << ":" << ntohs(sin->sin_port) << "\n"; + } } void OPCSink::cbAccept(struct ev_loop *loop, struct ev_io *watcher, int revents) @@ -72,6 +79,10 @@ void OPCSink::cbAccept(struct ev_loop *loop, struct ev_io *watcher, int revents) ev_io_init(&cli->ioRead, cbRead, sock, EV_READ); ev_io_start(loop, &cli->ioRead); + + if (self->mVerbose) { + std::clog << "Client connected from " << inet_ntoa(clientAddr.sin_addr) << "\n"; + } } void OPCSink::cbRead(struct ev_loop *loop, struct ev_io *watcher, int revents) @@ -89,6 +100,11 @@ void OPCSink::cbRead(struct ev_loop *loop, struct ev_io *watcher, int revents) if (r == 0) { // Client disconnecting + + if (self->mVerbose) { + std::clog << "Client disconnected\n"; + } + ev_io_stop(loop, watcher); delete cli; return; diff --git a/server/opcsink.h b/server/opcsink.h index 7c90a98ebdd1741e21167019d9a41dcdb44fc8e1..45560315effbbaacd8f24dce7a6f811058ef6386 100644 --- a/server/opcsink.h +++ b/server/opcsink.h @@ -46,10 +46,11 @@ public: typedef void (*callback_t)(Message &msg, void *context); - OPCSink(callback_t cb, void *context); + OPCSink(callback_t cb, void *context, bool verbose = false); void start(struct ev_loop *loop, struct addrinfo *listenAddr); private: + bool mVerbose; callback_t mCallback; void *mContext; struct ev_io mIOAccept;