2 ,SysUtils
,Sockets
,UnixType
,BaseUnix
8 procedure SC(fn
:pointer; retval
:cint
);
10 if retval
< 0 then begin
11 raise eXception
.Create(Format('Socket error %d operation %P',[SocketError
,fn
]));
15 procedure HandleMSG(sock
:tSocket
; var s
:tMemoryStream
; const from
: tSockAddr
);
19 var sendbuf
:array [1..128] of byte;
26 r
.Init(@sendbuf
,0,128);
31 r
.WriteWord(s
.length
,2);
32 SC(@fpsendto
,fpsendto(s_inet
,r
.base
,r
.length
,0,@from
,sizeof(sockaddr_in
)));
35 procedure s_SetupInet
;
36 var bind_addr
:tInetSockAddr
;
38 with bind_addr
do begin
42 s_inet
:=fpSocket(family
,SOCK_DGRAM
,IPPROTO_UDP
);
45 SC(@fpBind
,fpBind(s_inet
,@bind_addr
,sizeof(bind_addr
)));
48 var Terminated
:boolean=false;
50 procedure SignalHandler(sig
:cint
);CDecl;
53 if terminated
then raise eControlC
.Create('CtrlC DoubleTap') ;
55 writeln('Shutdown requested');
59 var Buffer
:array [1..4096] of byte;
65 FromLen
:=sizeof(From
);
66 pkLen
:=fprecvfrom(s_inet
,@Buffer
,sizeof(Buffer
),0,@from
,@fromlen
);
67 SC(@fprecvfrom
,pkLen
);
68 //writeln('size ',pkLen,' opcode ',buffer[1]);
69 s
.Init(@buffer
,pkLen
,sizeof(buffer
));
70 HandleMsg(s_inet
,s
,from
);
75 fpSignal(SigInt
,@SignalHandler
);
76 fpSignal(SigTerm
,@SignalHandler
);
77 repeat Loop
until Terminated
;
78 write('Standard terminate [');