1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
#include <dashel/dashel.h>
#include <iostream>
#include <cassert>
using namespace std;
using namespace Dashel;
class ReconnectingHub: public Hub
{
public:
ReconnectingHub(const string& target):
connected(false),
target(target)
{
connectToTarget();
}
void stepAndReconnect()
{
// first step
step(1000);
// if disconnected...
if (!connected)
{
// ...attempt to reconnect
connectToTarget();
}
}
protected:
bool connected;
string target;
protected:
void connectToTarget()
{
try
{
connect(target);
}
catch (const DashelException& e)
{
cout << endl << "Failed connecting to " << target << " : " << e.what() << endl;
}
}
protected:
virtual void connectionCreated(Stream * stream)
{
connected = true;
cout << endl << "Connected to " << stream->getTargetName() << endl;
}
virtual void incomingData(Stream * stream)
{
char c = stream->read<char>();
cout << ".";
}
virtual void connectionClosed(Stream * stream, bool abnormal)
{
connected = false;
cout << endl << "Lost connection to " << stream->getTargetName();
if (abnormal)
cout << " : " << stream->getFailReason();
cout << endl;
}
};
int main(int argc, char* argv[])
{
try
{
if (argc > 1)
{
ReconnectingHub reconnectingHub(argv[1]);
while (true)
{
reconnectingHub.stepAndReconnect();
}
}
else
{
cerr << "Usage " << argv[0] << " target" << endl;
return 1;
}
}
catch(const DashelException &e)
{
cerr << e.what() << endl;
}
return 0;
}
|