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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#include "uch.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TESTMSG
#ifdef TESTMSG
class MyRemoteAgent : public UchRemoteAgent {
public:
MyRemoteAgent (UchAgent* a, UchChannel* ch) : UchRemoteAgent (a, ch) {}
~MyRemoteAgent () {}
bool NewMessage (UchMsgBuffer&, bool);
};
class MyAgent : public UchAgent {
public:
MyAgent (UchAddress* a) : UchAgent (a) {}
~MyAgent () {}
UchRemoteAgent* HandleNew (UchChannel* ch) { return new MyRemoteAgent (this, ch); }
};
class MyMsg : public UchMessage {
CcuString S1;
CcuString S2;
public:
MyMsg (const char* s1, const char* s2) : UchMessage (), S1 (s1), S2 (s2) {}
MyMsg () : UchMessage (), S1 ("S1"), S2 ("S2") {}
~MyMsg () {}
void ReadFrom (UchMsgBuffer&, lword);
void WriteTo (UchMsgBuffer&);
void Dump () { printf ("[%s] [%s]\n", (const char*) S1, (const char*) S2); }
};
bool
MyRemoteAgent :: NewMessage (UchMsgBuffer& b, bool)
{
MyMsg m;
b.Get (m);
m.Dump ();
return true;
}
void
MyMsg :: WriteTo (UchMsgBuffer& b)
{
b << S1 << S2;
}
void
MyMsg :: ReadFrom (UchMsgBuffer& b, lword len)
{
b >> S1 >> S2;
}
#endif
UchAgent* A;
UchPortServer* PS;
const char* BUF;
int
fMatch (const char* match, lword host, sword port, const char*)
{
printf ("0x%lx:%d -> %s\n", host, port, match);
UchInetAddress* addr = new UchInetAddress (host == UchInetAddress::LoopBack ()
? LOOPBACK : host, port);
UchRemoteAgent* 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, *(UchInetAddress*) A->BoundTo ());
exit (0);
}
void
fTick (Millisecond t)
{
printf ("%d\n", t);
}
main (int argc, char** argv)
{
const char* id = argc > 1 ? argv [1] : "";
UchInetAddress addr (ANYADDR);
#ifdef TESTMSG
MyAgent a (&addr);
#else
UchAgent a (&addr);
#endif
if (a.Setup ()) {
A = &a;
UchPortServer 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, *(UchInetAddress*) a.BoundTo ());
UchSignalHandler h (*a.GetMultiplexer (), SigHup, fQuit);
// UchTimeOut to (*a.GetMultiplexer (), 1000, fTick);
a.Run ();
ps.Remove (buf, *(UchInetAddress*) a.BoundTo ());
}
}
|