#include "uch.h" #include #include #include #define TESTMSG #ifdef TESTMSG class MyRemoteAgent : public IvlRemoteAgent { public: MyRemoteAgent (IvlAgent* a, IvlChannel* ch) : IvlRemoteAgent (a, ch) {} ~MyRemoteAgent () {} bool NewMessage (IvlMsgBuffer&, bool); }; class MyAgent : public IvlAgent { public: MyAgent (IvlAddress* a) : IvlAgent (a) {} ~MyAgent () {} IvlRemoteAgent* HandleNew (IvlChannel* ch) { return new MyRemoteAgent (this, ch); } }; class MyMsg : public IvlMessage { IvlString S1; IvlString S2; public: MyMsg (const char* s1, const char* s2) : IvlMessage (), S1 (s1), S2 (s2) {} MyMsg () : IvlMessage (), S1 ("S1"), S2 ("S2") {} ~MyMsg () {} void ReadFrom (IvlMsgBuffer&, lword); void WriteTo (IvlMsgBuffer&); void Dump () { printf ("[%s] [%s]\n", (const char*) S1, (const char*) S2); } }; bool MyRemoteAgent :: NewMessage (IvlMsgBuffer& b, bool) { MyMsg m; b.Get (m); m.Dump (); return true; } void MyMsg :: WriteTo (IvlMsgBuffer& b) { b << S1 << S2; } void MyMsg :: ReadFrom (IvlMsgBuffer& b, lword len) { b >> S1 >> S2; } #endif IvlAgent* A; IvlPortServer* PS; const char* BUF; int fMatch (const char* match, lword host, sword port, const char*) { printf ("0x%lx:%d -> %s\n", host, port, match); IvlInetAddress* addr = new IvlInetAddress (host == IvlInetAddress::LoopBack () ? LOOPBACK : host, port); IvlRemoteAgent* ra = A->Contact (addr); if (ra) { printf ("joined\n"); #ifdef TESTMSG MyMsg m ("hello", "world"); ra->Send (m); #endif } else { printf ("connection failed\n"); delete addr; } return 1; } void fQuit (int, int) { printf ("quit\n"); PS->Remove (BUF, *(IvlInetAddress*) A->BoundTo ()); exit (0); } void fTick (Millisecond t) { printf ("%d\n", t); } main (int argc, char** argv) { const char* id = argc > 1 ? argv [1] : ""; IvlInetAddress addr (ANYADDR); #ifdef TESTMSG MyAgent a (&addr); #else IvlAgent a (&addr); #endif if (a.Setup ()) { A = &a; IvlPortServer ps ("portserv"); PS = &ps; ps.Match ("portserv:chatty", fMatch); char buf [64]; strcpy (buf, "%s:%u:test"); strcat (buf, id); BUF = buf; printf ("registering as %s\n", buf); ps.Register (buf, *(IvlInetAddress*) a.BoundTo ()); IvlSignalHandler h (*a.GetMultiplexer (), SigHup, fQuit); // IvlTimeOut to (*a.GetMultiplexer (), 1000, fTick); a.Run (); ps.Remove (buf, *(IvlInetAddress*) a.BoundTo ()); } }