* add method to tell if a string is a biniplist
[lcore.git] / 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   sysutils,\r
14   dnssync;\r
15 {$ifdef win32}\r
16   {$R *.RES}\r
17 {$endif}\r
18 \r
19 type\r
20   tsc=class\r
21     procedure sessionavailable(sender: tobject;error : word);\r
22     procedure dataavailable(sender: tobject;error : word);\r
23     procedure sessionconnected(sender: tobject;error : word);\r
24     procedure taskrun(wparam,lparam:longint);\r
25     procedure timehandler(sender:tobject);\r
26     procedure dnsrequestdone(sender:tobject;error : word);\r
27     procedure sessionclosed(sender:tobject;error : word);\r
28   end;\r
29 var\r
30   listensocket : tlsocket;\r
31   serversocket : tlsocket;\r
32   clientsocket : tlsocket;\r
33   sc : tsc;\r
34   task : tltask;\r
35 procedure tsc.sessionavailable(sender: tobject;error : word);\r
36 begin\r
37   writeln('received connection');\r
38   serversocket.dup(listensocket.accept);\r
39 end;\r
40 \r
41 var\r
42   receivebuf : string;\r
43   receivecount : integer;\r
44 procedure tsc.dataavailable(sender: tobject;error : word);\r
45 var\r
46   receiveddata : string;\r
47   receivedon : string;\r
48   line : string;\r
49 begin\r
50   receiveddata := tlsocket(sender).receivestr;\r
51   if sender=clientsocket then begin\r
52     receivedon := 'client socket';\r
53   end else begin\r
54     receivedon := 'server socket';\r
55   end;\r
56   writeln('received data '+receiveddata+' on '+receivedon);\r
57 \r
58   receivebuf := receivebuf+receiveddata;\r
59 \r
60   if receivebuf = 'hello world' then begin\r
61     receivebuf := '';\r
62     writeln('received hello world creating task');\r
63     task := tltask.create(sc.taskrun,nil,0,0);\r
64   end;\r
65   receivecount := receivecount +1;\r
66   if receivecount >50 then begin\r
67     writeln('received over 50 bits of data, pausing to let the operator take a look');\r
68     readln;\r
69     receivecount := 0;\r
70   end;\r
71   while pos(#10,receivebuf) > 0 do begin\r
72     line := receivebuf;\r
73     setlength(line,pos(#10,receivebuf)-1);\r
74     receivebuf := copy(receivebuf,pos(#10,receivebuf)+1,1000000);\r
75     if uppercase(copy(line,1,4))='PING' then begin\r
76       line[2] := 'o';\r
77       writeln('send pong:'+line);\r
78       clientsocket.sendstr(line+#10);\r
79     end;\r
80   end;\r
81 end;\r
82 \r
83 procedure tsc.sessionconnected(sender: tobject;error : word);\r
84 begin\r
85   if error=0 then begin\r
86     writeln('session is connected, local address is'+clientsocket.getxaddr);\r
87 \r
88     if (clientsocket.addr = '127.0.0.1') or (clientsocket.addr = '::1') then begin\r
89       clientsocket.sendstr('hello world');\r
90     end else begin\r
91       clientsocket.sendstr('nick test'#13#10'user x x x x'#13#10);\r
92     end;\r
93   end else begin\r
94     writeln('connect failed');\r
95   end;\r
96 end;\r
97 \r
98 var\r
99   das : tdnsasync;\r
100 \r
101 procedure tsc.taskrun(wparam,lparam:longint);\r
102 var\r
103   tempbinip : tbinip;\r
104   dummy : integer;\r
105 begin\r
106   writeln('task ran');\r
107   writeln('closing client socket');\r
108   clientsocket.close;\r
109 \r
110   writeln('looking up irc.ipv6.p10link.net using dnsasync');\r
111   das := tdnsasync.Create(nil);\r
112   das.onrequestdone := sc.dnsrequestdone;\r
113   //das.forwardfamily := af_inet6;\r
114   das.forwardlookup('irc.ipv6.p10link.net');\r
115 end;\r
116 \r
117 procedure tsc.dnsrequestdone(sender:tobject;error : word);\r
118 var\r
119   tempbinip : tbinip;\r
120   tempbiniplist : tbiniplist;\r
121 begin\r
122   writeln('irc.ipv6.p10link.net resolved to '+das.dnsresult+' connecting client socket there');\r
123   das.dnsresultbin(tempbinip);\r
124   tempbiniplist := biniplist_new;\r
125   biniplist_add(tempbiniplist,tempbinip);\r
126   clientsocket.addr := tempbiniplist;\r
127   clientsocket.port := '6667';\r
128   clientsocket.connect;\r
129   writeln(clientsocket.getxaddr);\r
130   das.free;\r
131 end;\r
132 \r
133 procedure tsc.timehandler(sender:tobject);\r
134 begin\r
135   //writeln('got timer event');\r
136 end;\r
137 procedure tsc.sessionclosed(sender:tobject;error : word);\r
138 begin\r
139   Writeln('session closed with error ',error);\r
140 end;\r
141 var\r
142   timer : tltimer;\r
143   ipbin : tbinip;\r
144   dummy : integer;\r
145 begin\r
146   ipbin := forwardlookup('invalid.domain',5);\r
147   writeln(ipbintostr(ipbin));\r
148 \r
149   ipbin := forwardlookup('p10link.net',5);\r
150   writeln(ipbintostr(ipbin));\r
151 \r
152   ipstrtobin('80.68.89.68',ipbin);\r
153   writeln('80.68.89.68 reverses to '+reverselookup(ipbin,5));\r
154 \r
155   ipstrtobin('2001:200::8002:203:47ff:fea5:3085',ipbin);\r
156   writeln('2001:200::8002:203:47ff:fea5:3085 reverses to '+reverselookup(ipbin,5));\r
157   writeln('creating and setting up listen socket');\r
158   listensocket := tlsocket.create(nil);\r
159   listensocket.addr := '::';\r
160   listensocket.port := '12345';\r
161   listensocket.onsessionavailable := sc.sessionavailable;\r
162   writeln('listening');\r
163   listensocket.listen;\r
164   writeln(listensocket.getxport);\r
165   writeln('listen socket is number ', listensocket.fdhandlein);\r
166   writeln('creating and setting up server socket');\r
167   serversocket := tlsocket.create(nil);\r
168   serversocket.ondataavailable := sc.dataavailable;\r
169   writeln('creating and setting up client socket');\r
170   clientsocket := tlsocket.create(nil);\r
171   clientsocket.addr := '::1';{'127.0.0.1';}\r
172   clientsocket.port := '12345';\r
173   clientsocket.onsessionconnected := sc.sessionconnected;\r
174   clientsocket.ondataAvailable := sc.dataavailable;\r
175   clientsocket.onsessionclosed := sc.sessionclosed;\r
176   writeln('connecting');\r
177   clientsocket.connect;\r
178   writeln('client socket is number ',clientsocket.fdhandlein);\r
179   writeln('creating and setting up timer');\r
180   timer := tltimer.create(nil);\r
181   timer.interval := 1000;\r
182   timer.ontimer := sc.timehandler;\r
183   timer.enabled := true;\r
184   writeln('entering message loop');\r
185   messageloop;\r
186   writeln('exiting cleanly');\r
187 end.\r