svn cleanup
[anytun.git] / Sockets / tests / x.cpp
blob2ca9b261a15ab0f2cb79fda511a843091d294558
1 #include <SocketHandler.h>
2 #include <TcpSocket.h>
3 #include <StdoutLog.h>
4 #ifndef _WIN32
5 #include <signal.h>
6 #endif
7 #include <IEventOwner.h>
8 #include <EventHandler.h>
10 #define HOST "localhost"
11 #define PORT 2222
13 #define TIME_US 250000
15 #define DEB(x) x
18 static bool quit = false;
19 static EventHandler *ph = NULL;
21 static int lc = 0;
22 static int l2c = 0;
23 static int l3c = 0;
26 #ifndef _WIN32
27 void sighandler(int s)
29 quit = true;
30 ph -> SetQuit();
34 void sigpipe(int s)
37 #endif
40 class evHandler : public EventHandler
42 public:
43 evHandler() : EventHandler() {}
44 evHandler(StdLog *p) : EventHandler(p) {}
46 void CloseAll() {
47 for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++)
49 Socket *p = it -> second;
50 p -> SetCloseAndDelete();
57 class lSocket : public TcpSocket, public IEventOwner
59 public:
60 lSocket(ISocketHandler& h, bool first = false) : TcpSocket(h), IEventOwner(static_cast<evHandler&>(h)), m_id(0), m_first(first) {
61 SetLineProtocol();
62 lc++;
64 ~lSocket() {
67 void OnConnect() {
68 if (!m_id)
70 m_id = AddEvent(0, TIME_US);
72 printf(".");
73 fflush(stdout);
75 void OnConnectFailed() {
76 printf("lSocket::OnConnectFailed\n");
79 void OnDelete() {
80 if (m_first)
81 printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
82 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
83 "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n"
84 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
85 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
88 void OnEvent(int id) {
89 if (id != m_id)
91 printf("ID MISMATCH!\n");
92 exit(-1);
94 if (!quit)
96 lSocket *p = new lSocket(Handler());
97 p -> SetDeleteByHandler();
98 p -> Open(HOST, PORT);
99 Handler().Add(p);
101 static_cast<evHandler&>(Handler()).SetQuit( quit );
102 SetCloseAndDelete();
105 private:
106 int m_id;
107 bool m_first;
111 class l2Socket : public TcpSocket, public IEventOwner
113 public:
114 l2Socket(ISocketHandler& h, bool first = false) : TcpSocket(h), IEventOwner(static_cast<evHandler&>(h)), m_id(0), m_first(first) {
115 SetLineProtocol();
116 l2c++;
118 ~l2Socket() {
121 void OnConnect() {
122 printf(".");
123 fflush(stdout);
125 void OnConnectFailed() {
126 printf("l2Socket::OnConnectFailed\n");
129 void OnLine(const std::string& line) {
130 if (!m_id)
132 m_id = AddEvent(0, TIME_US);
136 void OnDelete() {
137 if (m_first)
138 printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
139 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
140 "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n"
141 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
142 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
145 void OnEvent(int id) {
146 if (id != m_id)
148 printf("ID MISMATCH!\n");
149 exit(-1);
151 if (!quit)
153 l2Socket *p = new l2Socket(Handler());
154 p -> SetDeleteByHandler();
155 p -> Open(HOST, PORT);
156 Handler().Add(p);
158 static_cast<evHandler&>(Handler()).SetQuit( quit );
159 SetCloseAndDelete();
162 private:
163 int m_id;
164 bool m_first;
168 class l3Socket : public TcpSocket, public IEventOwner
170 public:
171 l3Socket(ISocketHandler& h, bool first = false) : TcpSocket(h), IEventOwner(static_cast<evHandler&>(h)), m_ehlo(false), m_id(0), m_first(first) {
172 SetLineProtocol();
173 l3c++;
175 ~l3Socket() {
178 void OnConnect() {
179 printf(".");
180 fflush(stdout);
182 void OnConnectFailed() {
183 printf("l3Socket::OnConnectFailed\n");
186 void OnLine(const std::string& line) {
187 if (!m_ehlo)
189 Send("EHLO alhem.net\r\n");
190 m_ehlo = true;
192 else
193 if (!m_id)
195 m_id = AddEvent(0, TIME_US);
199 void OnDelete() {
200 if (m_first)
201 printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
202 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
203 "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n"
204 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
205 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
208 void OnEvent(int id) {
209 if (id != m_id)
211 printf("ID MISMATCH!\n");
212 exit(-1);
214 if (!quit)
216 l3Socket *p = new l3Socket(Handler());
217 p -> SetDeleteByHandler();
218 p -> Open(HOST, PORT);
219 Handler().Add(p);
221 static_cast<evHandler&>(Handler()).SetQuit( quit );
222 Send("QUIT\r\n");
225 private:
226 bool m_ehlo;
227 int m_id;
228 bool m_first;
232 int main(int argc, char *argv[])
234 #ifndef _WIN32
235 signal(SIGHUP, sighandler);
236 signal(SIGINT, sighandler);
237 signal(SIGPIPE, sigpipe);
238 #endif
240 time_t tstart = time(NULL);
242 StdoutLog log;
244 evHandler h(&log);
245 ph = &h;
247 lSocket sock(h, true);
248 sock.Open(HOST, PORT);
249 h.Add(&sock);
251 l2Socket sock2(h, true);
252 sock2.Open(HOST, PORT);
253 h.Add(&sock2);
255 l3Socket sock3(h, true);
256 sock3.Open(HOST, PORT);
257 h.Add(&sock3);
259 h.EventLoop();
260 h.CloseAll();
262 // %! one socket refuses to go away
263 while (h.GetCount() > 1)
265 h.Select(1, 0);
267 printf("Exiting 1...\n");
268 fflush(stdout);
270 printf("Exiting 2...\n");
271 fflush(stdout);
273 printf("Exiting 3...\n");
274 fflush(stdout);
276 printf("Exiting 4...\n");
277 fflush(stdout);
279 printf("Exiting 5...\n");
280 fflush(stdout);
282 printf("Exiting 6...\n");
283 fflush(stdout);
285 time_t tstop = time(NULL);
287 time_t total = tstop - tstart + 1;
289 printf("lc: %d\n", lc);
290 printf("l2c: %d\n", l2c);
291 printf("l3c: %d\n", l3c);
293 printf("lc: %f\n", (double)lc / (double)total);
294 printf("l2c: %f\n", (double)l2c / (double)total);
295 printf("l3c: %f\n", (double)l3c / (double)total);