114 lines
2.7 KiB
Plaintext
114 lines
2.7 KiB
Plaintext
{$X+,B-,V-}
|
|
program SendHello;
|
|
|
|
{ Simple IPX demonstration program with 1 ESR.}
|
|
|
|
uses crt,nwMisc,nwIPX;
|
|
|
|
CONST IOSocket=$5678;
|
|
|
|
Var NewStack :array[1..512] of word; { !! used by ESR }
|
|
StackBottom:word; { !! used by ESR }
|
|
|
|
SendEcb :Tecb;
|
|
IpxHdr :TipxHeader;
|
|
socket :word;
|
|
dest :TinternetworkAddress;
|
|
buf :array[1..546] of byte;
|
|
t :byte;
|
|
w :word;
|
|
s :string;
|
|
PacketSent :boolean;
|
|
|
|
{$F+}
|
|
Procedure SendESRhandler;
|
|
begin
|
|
PacketSent:=true;
|
|
end;
|
|
{$F-}
|
|
|
|
{$F+}
|
|
Procedure SendESR; 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 bx
|
|
push dx
|
|
|
|
CALL SendEsrHandler
|
|
|
|
pop dx
|
|
pop bx
|
|
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;
|
|
|
|
for t:=1 to 4 do dest.net[t]:=$00; { this net / segment }
|
|
for t:=1 to 6 do dest.node[t]:=$FF; { all nodes }
|
|
dest.socket:=IOsocket;
|
|
w:=0;
|
|
|
|
Repeat
|
|
inc (w);
|
|
|
|
{ Fill buffer (ECB.fragment[2]^) }
|
|
str(w:4,s);
|
|
s:=s+' IPX: Hello World';
|
|
FillChar(buf,546,#0);
|
|
move(s[1],buf,ord(s[0]));
|
|
|
|
{ setup ECB and IPX header }
|
|
PacketSent:=False;
|
|
IPXsetupSendECB(Addr(SendESR),IOsocket,dest,@buf,ord(s[0]),
|
|
IpxHdr,SendEcb);
|
|
IPXsendPacket(SendEcb);
|
|
|
|
REPEAT
|
|
|
|
IpxRelinquishControl;
|
|
delay(100);
|
|
|
|
IF PacketSent
|
|
then begin
|
|
{ ECB.InUseFlag was lowered, now determine if packet was sent: }
|
|
CASE SendEcb.CompletionCode OF
|
|
$00:writeln('IPX packet #',w:0,' was sent.');
|
|
$FC:writeln('The send of packet #',w:0,' was canceled.');
|
|
{ impossible, as this cancelation to be done by THIS program, and it doesn't }
|
|
$FD:writeln('Packet# ',w:0,' is malformed and was not sent.');
|
|
{ illegal param: packet length, number of fragments, fragment size. }
|
|
$FE:writeln('Packet# ',w:0,' was undelivered. No stations listening.');
|
|
$FF:writeln('Packet# ',w:0,' not sent due to a hardware error.');
|
|
end;
|
|
end;
|
|
|
|
UNTIL PacketSent or Keypressed;
|
|
|
|
delay(750); { delay 0.75 sec before sending another packet }
|
|
|
|
UNTIL keypressed;
|
|
|
|
IF NOT IPXcloseSocket(IOsocket)
|
|
then writeln('IPXcloseSocket returned error# ',nwIPX.result);
|
|
|
|
end. |