You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

lcoretest.dpr 6.1KB

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