{$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.