1 #include <SocketHandler.h>
7 #include <IEventOwner.h>
8 #include <EventHandler.h>
10 #define HOST "localhost"
13 #define TIME_US 250000
18 static bool quit
= false;
19 static EventHandler
*ph
= NULL
;
27 void sighandler(int s
)
40 class evHandler
: public EventHandler
43 evHandler() : EventHandler() {}
44 evHandler(StdLog
*p
) : EventHandler(p
) {}
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
60 lSocket(ISocketHandler
& h
, bool first
= false) : TcpSocket(h
), IEventOwner(static_cast<evHandler
&>(h
)), m_id(0), m_first(first
) {
70 m_id
= AddEvent(0, TIME_US
);
75 void OnConnectFailed() {
76 printf("lSocket::OnConnectFailed\n");
81 printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
82 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
83 "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n"
84 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
85 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
88 void OnEvent(int id
) {
91 printf("ID MISMATCH!\n");
96 lSocket
*p
= new lSocket(Handler());
97 p
-> SetDeleteByHandler();
98 p
-> Open(HOST
, PORT
);
101 static_cast<evHandler
&>(Handler()).SetQuit( quit
);
111 class l2Socket
: public TcpSocket
, public IEventOwner
114 l2Socket(ISocketHandler
& h
, bool first
= false) : TcpSocket(h
), IEventOwner(static_cast<evHandler
&>(h
)), m_id(0), m_first(first
) {
125 void OnConnectFailed() {
126 printf("l2Socket::OnConnectFailed\n");
129 void OnLine(const std::string
& line
) {
132 m_id
= AddEvent(0, TIME_US
);
138 printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
139 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
140 "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n"
141 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
142 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
145 void OnEvent(int id
) {
148 printf("ID MISMATCH!\n");
153 l2Socket
*p
= new l2Socket(Handler());
154 p
-> SetDeleteByHandler();
155 p
-> Open(HOST
, PORT
);
158 static_cast<evHandler
&>(Handler()).SetQuit( quit
);
168 class l3Socket
: public TcpSocket
, public IEventOwner
171 l3Socket(ISocketHandler
& h
, bool first
= false) : TcpSocket(h
), IEventOwner(static_cast<evHandler
&>(h
)), m_ehlo(false), m_id(0), m_first(first
) {
182 void OnConnectFailed() {
183 printf("l3Socket::OnConnectFailed\n");
186 void OnLine(const std::string
& line
) {
189 Send("EHLO alhem.net\r\n");
195 m_id
= AddEvent(0, TIME_US
);
201 printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
202 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
203 "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n"
204 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
205 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
208 void OnEvent(int id
) {
211 printf("ID MISMATCH!\n");
216 l3Socket
*p
= new l3Socket(Handler());
217 p
-> SetDeleteByHandler();
218 p
-> Open(HOST
, PORT
);
221 static_cast<evHandler
&>(Handler()).SetQuit( quit
);
232 int main(int argc
, char *argv
[])
235 signal(SIGHUP
, sighandler
);
236 signal(SIGINT
, sighandler
);
237 signal(SIGPIPE
, sigpipe
);
240 time_t tstart
= time(NULL
);
247 lSocket
sock(h
, true);
248 sock
.Open(HOST
, PORT
);
251 l2Socket
sock2(h
, true);
252 sock2
.Open(HOST
, PORT
);
255 l3Socket
sock3(h
, true);
256 sock3
.Open(HOST
, PORT
);
262 // %! one socket refuses to go away
263 while (h
.GetCount() > 1)
267 printf("Exiting 1...\n");
270 printf("Exiting 2...\n");
273 printf("Exiting 3...\n");
276 printf("Exiting 4...\n");
279 printf("Exiting 5...\n");
282 printf("Exiting 6...\n");
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
);