126 lines
3.2 KiB
Plaintext
126 lines
3.2 KiB
Plaintext
{$X+,V-,B-}
|
|
program S_PEP;
|
|
|
|
{ Testprogram for the nwPEP unit / NwTP 0.6 API. (c) 1993,1995, R.Spronk }
|
|
|
|
uses crt,nwMisc,nwIPX,nwPEP; { Listener/ Slave }
|
|
|
|
{ Listen for incoming packet.. sent acknowledgement of receipt }
|
|
|
|
{ Note that the acknowledgement is done automatically by the receiving ESR }
|
|
|
|
CONST IOSocket=$5678;
|
|
|
|
Var ListenECB :Tecb;
|
|
ListenPepHdr :TpepHeader;
|
|
|
|
SendECB :Tecb;
|
|
SendPepHdr :TpepHeader;
|
|
|
|
socket :word;
|
|
buf :array[1..546] of byte;
|
|
t :byte;
|
|
ReceivedBufLen:word;
|
|
PacketReceived:boolean;
|
|
|
|
NewStack:array[1..1024] of word; { !! used by ESR }
|
|
StackBottom:word; { !! used by ESR }
|
|
|
|
|
|
|
|
{$F+}
|
|
Procedure ListenAndAckHandler(Var p:TPecb);
|
|
begin
|
|
If (ListenECB.CompletionCode<>0)
|
|
or (ListenPepHdr.IPXhdr.packetType<>PEP_PACKET_TYPE)
|
|
or (ListenPepHdr.clienttype<>$EA)
|
|
then IPXlistenForPacket(ListenECB)
|
|
else begin
|
|
PacketReceived:=true;
|
|
ListenPepHdr.IPXhdr.source.socket:=swap(ListenPepHdr.IPXhdr.source.socket);
|
|
{ socket is hi-lo in IPX/PEPHeaders. SetupSendECB expects lo-hi }
|
|
PEPsetupSendECB(NIL,IOsocket,ListenPepHdr.IPXhdr.source,@buf,0,
|
|
SendPepHdr,SendECB);
|
|
SendPepHdr.TransactionId:=ListenPepHdr.TransactionId;
|
|
SendPepHdr.clientType:=$EA;
|
|
IPXsendPacket(SendECB);
|
|
end;
|
|
end;
|
|
{$F-}
|
|
|
|
{$F+}
|
|
Procedure ListenAndAckESR; assembler;
|
|
asm { ES:SI are the only valid registers when entering this procedure ! }
|
|
mov dx, seg stackbottom
|
|
mov ds, dx
|
|
|
|
mov dx,ss { setup of a new local stack }
|
|
mov bx,sp { ss:sp copied to dx:bx}
|
|
mov ax,ds
|
|
mov ss,ax
|
|
mov sp,offset stackbottom
|
|
push dx { push old ss:sp on new stack }
|
|
push bx
|
|
|
|
push es { push es:si on stack as local vars }
|
|
push si
|
|
mov di,sp
|
|
|
|
push ss { push address of local ptr on stack }
|
|
push di
|
|
CALL ListenAndAckHandler
|
|
|
|
add sp,4 { skip stack ptr-copy }
|
|
pop bx { restore ss:sp from new stack }
|
|
pop dx
|
|
mov sp,bx
|
|
mov ss,dx
|
|
end;
|
|
{$F-}
|
|
|
|
|
|
Var dest:TinternetworkAddress;
|
|
ticks,ticks2:word;
|
|
|
|
begin
|
|
IF NOT IpxInitialize
|
|
then begin
|
|
writeln('Ipx needs to be installed.');
|
|
halt(1);
|
|
end;
|
|
socket:=IOSocket;
|
|
IF NOT IPXopenSocket(Socket,SHORT_LIVED_SOCKET)
|
|
then begin
|
|
writeln('IPXopenSocket returned error# ',nwIPX.result);
|
|
halt(1);
|
|
end;
|
|
|
|
{ listen for incoming pep-packet }
|
|
|
|
PacketReceived:=False;
|
|
{ Empty receive buffer (ListenECB.fragment[2].address^) }
|
|
FillChar(buf,546,#0);
|
|
|
|
{ Setup ECB and IPX header }
|
|
PEPSetupListenECB(Addr(ListenAndAckESR),IOsocket,@buf,546,
|
|
ListenPepHdr,ListenECB);
|
|
|
|
IPXListenForPacket(ListenECB);
|
|
writeln('Listening for incoming packet.');
|
|
|
|
IPXGetIntervalMarker(ticks);
|
|
REPEAT
|
|
IPXrelinquishControl;
|
|
IPXGetIntervalMarker(ticks2)
|
|
UNTIL PacketReceived or ((ticks2-ticks)>(30*18));
|
|
|
|
{ do something with received buffer }
|
|
IF PacketReceived
|
|
then writeln('Packet received and acknowledged.')
|
|
else writeln('Timeout: no packet received in 30 seconds.');
|
|
|
|
IF NOT IPXcloseSocket(IOsocket)
|
|
then writeln('IPXcloseSocket returned error# ',nwIPX.result);
|
|
|
|
end.
|