the big lot of changes by beware
[lcore.git] / httpserver_20080306 / lcoretest.dpr
1 program lcoretest;\r
2 \r
3 uses\r
4   lcore,\r
5   lsocket,\r
6   {$ifdef win32}\r
7     lcorewsaasyncselect in 'lcorewsaasyncselect.pas',\r
8   {$else}\r
9     lcoreselect,\r
10   {$endif}\r
11   dnsasync,\r
12   binipstuff,\r
13   dnssync;\r
14 {$ifdef win32}\r
15   {$R *.RES}\r
16 {$endif}\r
17 \r
18 type\r
19   tsc=class\r
20     procedure sessionavailable(sender: tobject;error : word);\r
21     procedure dataavailable(sender: tobject;error : word);\r
22     procedure sessionconnected(sender: tobject;error : word);\r
23     procedure taskrun(wparam,lparam:longint);\r
24     procedure timehandler(sender:tobject);\r
25     procedure dnsrequestdone(sender:tobject;error : word);\r
26     procedure sessionclosed(sender:tobject;error : word);\r
27   end;\r
28 var\r
29   listensocket : tlsocket;\r
30   serversocket : tlsocket;\r
31   clientsocket : tlsocket;\r
32   sc : tsc;\r
33   task : tltask;\r
34 procedure tsc.sessionavailable(sender: tobject;error : word);\r
35 begin\r
36   writeln('received connection');\r
37   serversocket.dup(listensocket.accept);\r
38 end;\r
39 \r
40 var\r
41   receivebuf : string;\r
42   receivecount : integer;\r
43 procedure tsc.dataavailable(sender: tobject;error : word);\r
44 var\r
45   receiveddata : string;\r
46   receivedon : string;\r
47 begin\r
48   receiveddata := tlsocket(sender).receivestr;\r
49   if sender=clientsocket then begin\r
50     receivedon := 'client socket';\r
51   end else begin\r
52     receivedon := 'server socket';\r
53   end;\r
54   writeln('received data '+receiveddata+' on '+receivedon);\r
55   if sender=serversocket then begin\r
56     receivebuf := receivebuf+receiveddata;\r
57   end;\r
58   if receivebuf = 'hello world' then begin\r
59     receivebuf := '';\r
60     writeln('received hello world creating task');\r
61     task := tltask.create(sc.taskrun,nil,0,0);\r
62   end;\r
63   receivecount := receivecount +1;\r
64   if receivecount >50 then begin\r
65     writeln('received over 50 bits of data, pausing to let the operator take a look');\r
66     readln;\r
67     receivecount := 0;\r
68   end;\r
69 \r
70 end;\r
71 \r
72 procedure tsc.sessionconnected(sender: tobject;error : word);\r
73 begin\r
74   if error=0 then begin\r
75     writeln('session is connected');\r
76     if clientsocket.addr = '127.0.0.1' then begin\r
77       clientsocket.sendstr('hello world');\r
78     end else begin\r
79       clientsocket.sendstr('get /'#13#10#13#10);\r
80     end;\r
81   end else begin\r
82     writeln('connect failed');\r
83   end;\r
84 end;\r
85 \r
86 var\r
87   das : tdnsasync;\r
88 \r
89 procedure tsc.taskrun(wparam,lparam:longint);\r
90 var\r
91   tempbinip : tbinip;\r
92   dummy : integer;\r
93 begin\r
94   writeln('task ran');\r
95   writeln('closing client socket');\r
96   clientsocket.close;\r
97 \r
98   writeln('looking up www.kame.net using dnsasync');\r
99   das := tdnsasync.Create(nil);\r
100   das.onrequestdone := sc.dnsrequestdone;\r
101   das.forwardfamily := af_inet6;
102   das.forwardlookup('www.kame.net');\r
103 end;\r
104 \r
105 procedure tsc.dnsrequestdone(sender:tobject;error : word);\r
106 begin\r
107   writeln('www.kame.net resolved to '+das.dnsresult+' connecting client socket there');\r
108   clientsocket.addr := das.dnsresult;\r
109   clientsocket.port := '80';\r
110   clientsocket.connect;\r
111   das.free;\r
112 end;\r
113 \r
114 procedure tsc.timehandler(sender:tobject);\r
115 begin\r
116   //writeln('got timer event');\r
117 end;\r
118 procedure tsc.sessionclosed(sender:tobject;error : word);\r
119 begin\r
120   Writeln('session closed with error ',error);\r
121 end;\r
122 var\r
123   timer : tltimer;\r
124   ipbin : tbinip;\r
125   dummy : integer;\r
126 begin\r
127   ipbin := forwardlookup('invalid.domain',5);\r
128   writeln(ipbintostr(ipbin));\r
129 \r
130   ipbin := forwardlookup('p10link.net',5);\r
131   writeln(ipbintostr(ipbin));\r
132 \r
133   ipstrtobin('80.68.89.68',ipbin);\r
134   writeln('80.68.89.68 reverses to '+reverselookup(ipbin,5));\r
135 \r
136   ipstrtobin('2001:200::8002:203:47ff:fea5:3085',ipbin);\r
137   writeln('2001:200::8002:203:47ff:fea5:3085 reverses to '+reverselookup(ipbin,5));\r
138   writeln('creating and setting up listen socket');\r
139   listensocket := tlsocket.create(nil);\r
140   listensocket.addr := '0.0.0.0';\r
141   listensocket.port := '12345';\r
142   listensocket.onsessionavailable := sc.sessionavailable;\r
143   writeln('listening');\r
144   listensocket.listen;\r
145   writeln('listen socket is number ', listensocket.fdhandlein);\r
146   writeln('creating and setting up server socket');\r
147   serversocket := tlsocket.create(nil);\r
148   serversocket.ondataavailable := sc.dataavailable;\r
149   writeln('creating and setting up client socket');\r
150   clientsocket := tlsocket.create(nil);\r
151   clientsocket.addr := {'::1';}'127.0.0.1';\r
152   clientsocket.port := '12345';\r
153   clientsocket.onsessionconnected := sc.sessionconnected;\r
154   clientsocket.ondataAvailable := sc.dataavailable;\r
155   clientsocket.onsessionclosed := sc.sessionclosed;\r
156   writeln('connecting');\r
157   clientsocket.connect;\r
158   writeln('client socket is number ',clientsocket.fdhandlein);\r
159   writeln('creating and setting up timer');\r
160   timer := tltimer.create(nil);\r
161   timer.interval := 1000;\r
162   timer.ontimer := sc.timehandler;\r
163   timer.enabled := true;\r
164   writeln('entering message loop');\r
165   messageloop;\r
166   writeln('exiting cleanly');\r
167 end.\r