home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 21
/
CD_ASCQ_21_040595.iso
/
dos
/
prg
/
pas
/
nwtp06
/
r3_hello.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-03-01
|
4KB
|
146 lines
{$X+,V-,B-}
program RecHello3;
{ Simple IPX demonstration program, that uses one receive ESR.
Run this program on 1 workstation, run S_HELLO or S1_HELLO on another.
S_HELLO will send "hello world" messages,
this workstation will receive them. }
{ This program consists of two concurrent processes:
1. (background) An ESR that fills a global receive buffer with
incoming packets. Only when the buffer is full
will packets be discarded.
2. (foreground) A process that performs its regular task. Whenever
there is time, the process will process the
received packets. }
uses crt,nwMisc,nwIPX;
CONST IOSocket=$5678;
Var ReceiveEcb :Tecb;
IpxHdr :TipxHeader;
socket :word;
buf :array[1..546] of byte;
t :byte;
ReceivedBufLen:word;
ReceivedMsg:array[1..100] of record
InUse:Boolean;
Message:string[25];
end;
EsrBufInd :Byte; { used by ESR }
NewStack:array[1..1024] of word; { !! used by ESR }
StackBottom:word; { !! used by ESR }
{$F+}
Procedure ListenESRhandler(Var p:Tpecb);
begin
{ look for an empty spot in the global buffer }
EsrBufInd:=1;
while (EsrBufInd<=100) and ReceivedMsg[EsrBufInd].Inuse
do inc(EsrBufInd);
IF EsrBufInd<=100
then begin
{ empty place found. Insert msg }
with ReceivedMsg[EsrBufInd]
do begin
Message[0]:=chr(p^.fragment[2].size);
if Message[0]>#25 then Message[0]:=#25;
move(p^.fragment[2].address^,Message[1],ord(Message[0]));
InUse:=True;
end;
end
else ; { entire buffer is filled => discard packet }
{ Setup to listen for next incoming packet }
IPXListenForPacket(ReceiveECB);
end;
{$F-}
{$F+}
Procedure ListenESR; 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 ListenEsrHandler
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-}
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;
FillChar(buf,546,#0);
{ Setup ECB and IPX header }
IPXsetupListenECB(Addr(ListenESR),IOsocket,@buf,546,
IpxHdr,ReceiveEcb);
IPXListenForPacket(ReceiveECB);
writeln('ESR will start filling a global buffer with packets received.');
writeln('Starting foreground process...');
writeln;
writeln('Foreground process just writes a ''dot'' to the screen every second.');
writeln('When a key is pressed, this process is terminated and the received');
writeln('packets are shown.');
REPEAT
IPXrelinquishControl;
delay(1000);
write('.');
UNTIL KeyPressed;
writeln;
writeln('Dumping global receive buffer -- filled by background process.');
for t:=1 to 100
do if ReceivedMsg[t].Inuse
then begin
writeln(ReceivedMsg[t].Message);
ReceivedMsg[t].Inuse:=False; { give entry in buffer free }
end;
{ You may also choose to process just 1 entry in the received buffer.
Set Inuse to False after processing, so the ESR can fill it again }
IF NOT IPXcloseSocket(IOsocket)
then writeln('IPXcloseSocket returned error# ',nwIPX.result);
end.