The Ice run time uses the Ice::Stats interface to report the number of bytes sent and received over the wire on every operation invocation:
module Ice {
local interface Stats {
void bytesSent(string protocol, int num);
void bytesReceived(string protocol, int num);
};
local interface Communicator {
Stats getStats();
// ...
};
};
The Ice run time calls bytesReceived as it reads data from the network and bytesSent as it writes data to the network. A very simple implementation of the Stats interface could look as follows:
class MyStats : public virtual Ice::Stats {
public:
virtual void bytesSent(const string& prot, Ice::Int num)
{
cerr << prot << ": sent " << num << " bytes" << endl;
}
virtual void bytesReceived(const string& prot, Ice::Int)
{
cerr << prot << ": received " << num << " bytes" << endl;
}
};
To register your implementation, you must pass it in an InitializationData parameter when you initialize a communicator:
Ice::InitializationData id; id.stats = new MyStats; Ice::CommunicatorPtr ic = Ice::initialize(id);
You can install a Stats object on either the client or the server side (or both). Here is some example output produced by installing a MyStats object in a simple server:
tcp: received 14 bytes tcp: received 32 bytes tcp: sent 26 bytes tcp: received 14 bytes tcp: received 33 bytes tcp: sent 25 bytes ...
In practice, your Stats implementation will probably be a bit more sophisticated: for example, the object can accumulate statistics in member variables and make the accumulated statistics available via member functions, instead of simply printing everything to the standard error output.

