From f491545c47431c1c44a543b39e5046c2d7505bb1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tom=C3=A1=C5=A1=20Brada?= Date: Thu, 10 Sep 2015 20:16:39 +0200 Subject: [PATCH] Reciever and Transmitter test for TC. --- RecvTC.pas | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TestTC.pas | 43 ++++++++++++++++++++++++++++++++ brodnetd.pas | 1 + 3 files changed, 125 insertions(+) create mode 100644 RecvTC.pas create mode 100644 TestTC.pas diff --git a/RecvTC.pas b/RecvTC.pas new file mode 100644 index 0000000..570f453 --- /dev/null +++ b/RecvTC.pas @@ -0,0 +1,81 @@ +uses MemStream,NetAddr + ,SysUtils,Sockets,UnixType,BaseUnix + ; + + +var s_inet:tSocket; + +procedure SC(fn:pointer; retval:cint); + begin + if retval < 0 then begin + raise eXception.Create(Format('Socket error %d operation %P',[SocketError,fn])); + end; + end; + +procedure HandleMSG(sock:tSocket; var s:tMemoryStream; const from: tSockAddr); + var opcode:byte; + var trid:word; + var sec:word; + var sendbuf:array [1..128] of byte; + var r:tMemoryStream; + begin + opcode:=s.readbyte; + assert(opcode=6); + s.Read(trid,2); + s.Read(sec,2); + r.Init(@sendbuf,0,128); + r.WriteByte(4); + trid:=22; //intel :) + r.Write(trid,2); + r.Write(sec,2); + r.WriteWord(s.length,2); + SC(@fpsendto,fpsendto(s_inet,r.base,r.length,0,@from,sizeof(sockaddr_in))); +end; + +procedure s_SetupInet; + var bind_addr:tInetSockAddr; + begin + with bind_addr do begin + family:=AF_INET; + port:=htons(3511); + addr:=0; {any} + s_inet:=fpSocket(family,SOCK_DGRAM,IPPROTO_UDP); + SC(@fpSocket,s_inet); + end; + SC(@fpBind,fpBind(s_inet,@bind_addr,sizeof(bind_addr))); + end; + +var Terminated:boolean=false; + +procedure SignalHandler(sig:cint);CDecl; + begin + writeln; + if terminated then raise eControlC.Create('CtrlC DoubleTap') ; + Terminated:=true; + writeln('Shutdown requested'); + end; + +procedure Loop; + var Buffer:array [1..4096] of byte; + var s:tMemoryStream; + var pkLen:LongInt; + var From:tSockAddr; + var FromLen:LongWord; + begin + FromLen:=sizeof(From); + pkLen:=fprecvfrom(s_inet,@Buffer,sizeof(Buffer),0,@from,@fromlen); + SC(@fprecvfrom,pkLen); + //writeln('size ',pkLen,' opcode ',buffer[1]); + s.Init(@buffer,pkLen,sizeof(buffer)); + HandleMsg(s_inet,s,from); +end; + +BEGIN + s_setupInet; + fpSignal(SigInt,@SignalHandler); + fpSignal(SigTerm,@SignalHandler); + repeat Loop until Terminated; + write('Standard terminate ['); + CloseSocket(s_inet); + writeln(']'); +END. \ No newline at end of file diff --git a/TestTC.pas b/TestTC.pas new file mode 100644 index 0000000..641d2b1 --- /dev/null +++ b/TestTC.pas @@ -0,0 +1,43 @@ +unit TestTC; +INTERFACE +IMPLEMENTATION +USES ServerLoop + ,TC + ,MemStream + ; +type t=object + tcs:TC.tTCS; + cnt:byte; + buf: array [1..4096] of char; + procedure CanSend(size:word); + procedure Init; + end; + +procedure t.CanSend(size:word); + var s:tMemoryStream; + begin + s.Init(@buf,0,4096); + tcs.WriteHeaders(s); + if size>s.size then size:=s.size; + s.Skip(size-1); + s.WriteByte(9); + tcs.Send(s); +end; + +procedure t.Init; + begin + cnt:=0; + tcs.Init; + tcs.rid:=42; + tcs.lid:=22; + tcs.Remote.FromString('//ip4/192.168.1.47/3511'); + tcs.CanSend:=@CanSend; + TC.RegTXer(tcs); + tcs.Start; + writeln('TestTC: Transfer started'); +end; + +var o:t; +BEGIN + o.Init; +END. \ No newline at end of file diff --git a/brodnetd.pas b/brodnetd.pas index dbc3d4a..942e7b5 100644 --- a/brodnetd.pas +++ b/brodnetd.pas @@ -3,6 +3,7 @@ PROGRAM brodnetd; { Poll loop. Read message, get handler, exec handler. } uses ServerLoop ,TestWatch + ,TestTC ; BEGIN -- 2.11.4.GIT