home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C!T ROM 5
/
ctrom5b.zip
/
ctrom5b
/
PROGRAM
/
PASCAL
/
NWTP06
/
R1_HELLO.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-03-01
|
4KB
|
136 lines
{$X+,V-,B-}
program RecHello1;
{ 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. }
uses crt,nwMisc,nwIPX;
CONST IOSocket=$5678;
Var ReceiveEcb :Tecb;
IpxHdr :TipxHeader;
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 ListenESRhandler;
begin
PacketReceived:=true;
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 bx
CALL ListenEsrHandler
pop bx
pop dx
mov sp,bx { restore stack }
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;
Repeat
PacketReceived:=False;
{ Empty receive buffer (ReceiveEcb.fragment[2].address^) }
FillChar(buf,546,#0);
{ Setup ECB and IPX header }
IPXsetupListenECB(Addr(ListenESR),IOsocket,@buf,546,
IpxHdr,ReceiveEcb);
IPXListenForPacket(ReceiveECB);
REPEAT
delay(1000);
Writeln('Packet received: ',PacketReceived);
IF PacketReceived { ESR has signalled that a packet has been received }
then begin
Case ReceiveECB.CompletionCode OF
$00:begin { Dump received bytes.. }
Write('Data received : ');
ReceivedBufLen:=swap(IpxHdr.length)-SizeOf(TipxHeader);
for t:=1 to ReceivedBufLen
do write(chr(buf[t]));
writeln;
end;
$FC:Writeln('The listen request has been canceled.');
{ impossible, as the cancelation has to be done by this program, and it doesn't }
$FD:Writeln('Packet overflow error.');
{ 0 fragments, or receiving buffer too small. }
$FF:Writeln('The socket is closed.');
{ Impossible. The socket is definitely open. See above. }
end;
{ Now we're going to squeeze all information out of the IpxHdr }
writeln('*IPX header info*');
writeln('-total length : ',swap(IpxHdr.length):0);
writeln('-data length : ',swap(IpxHdr.Length)-SizeOf(TipxHeader));
writeln('-number of hops: ',(IpxHdr.TransportControl AND $0F):0);
write('-sending adress: [');
for t:=1 to 4
do write(HexStr(IpxHdr.source.net[t],2));
write('|');
for t:=1 to 6
do write(HexStr(IpxHdr.source.node[t],2));
write('|');
writeln(HexStr(swap(IpxHdr.source.socket),4),']');
write('-destined for : [');
for t:=1 to 4
do write(HexStr(IpxHdr.destination.net[t],2));
write('|');
for t:=1 to 6
do write(HexStr(IpxHdr.destination.node[t],2));
write('|');
writeln(HexStr(swap(IpxHdr.destination.socket),4),']');
writeln;
end;
UNTIL (KeyPressed or PacketReceived);
UNTIL keypressed;
IF NOT IPXcloseSocket(IOsocket)
then writeln('IPXcloseSocket returned error# ',nwIPX.result);
end.