Routine for communicate via IPX protocol

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Category: System

Program: Ipx.pas
File exe: Sendmess.exeRecmess.exe
need: Net_serv.pasRecmess.pasSendmess.pas

Routine for communicate via IPX protocol. Send or receive data. IPX and SPX are derived from Xerox Network Systems' IDP and SPP protocols, respectively. IPX is a network layer protocol (layer 3 of the OSI Model), while SPX is a transport layer protocol (layer 4 of the OSI Model). The SPX layer sits on top of the IPX layer and provides connection-oriented services between two nodes on the network. SPX is used primarily by client–server applications. More information on https://en.wikipedia.org/wiki/IPX/SPX.
{ IPX.PAS                                                            }
{ Rutiny sluziace ku komunikacii IPX protokolom.                     }
{                                                                    }
{ Datum:20.02.2016                              http://www.trsek.com }
 
unit ipx;
 
interface
 
type
  nodeid=array[1..6]of byte;
  netwid=array[1..4]of byte;
  ipxaddress=record
	       network:netwid;
	       node:nodeid;
	       socket:word;
	     end;
  Tecb=record
	 link:array[1..2]of integer;
	 esr:pointer;
	 inuse:byte;
	 compcode:byte;
	 socketno:word;
	 ipxwspc:array[1..4]of byte;
	 drvwspc:array[1..12]of byte;
	 locnoad:nodeid;
	 fragcnt:array[1..2]of byte;
	 fragaddr:pointer;
	 fragsize:word;
       end;
  Tipxhead=record
	     case integer of
	     1:(
	       checksum:array[1..2]of byte;
	       len:word;
	       transctrl:byte;
	       packettyp:byte;
	       destnetw:netwid;
	       destnode:nodeid;
	       destsckt:word;
	       sournetw:netwid;
	       sournode:nodeid;
	       soursckt:word;
	       );
	     2:(
	       n_a:array[1..6]of byte;
	       dest:ipxaddress;
	       sour:ipxaddress;
	       );
	   end;
 
const
  shortlive=0;
  openstyle:byte=shortlive;
  lenheadpacket=30;
  maxlenpacket=576;
  unknown:netwid=(0,0,0,0);
  all:nodeid=($ff,$ff,$ff,$ff,$ff,$ff);
 
var
  neterror:byte;
 
procedure exittodos(msg:string;errcode:word);
procedure ipxinitialize;
procedure opensocket(socketno:word);
procedure closesocket(socketno:word);
procedure sendpacket(var ecb:tecb);
procedure receivepacket(var ecb:tecb);
procedure cancelevent(var ecb:tecb);
 
implementation
uses dos;
 
var
  notrunnetw:boolean;
  int7a:pointer;
  r:registers;
 
procedure exittodos(msg:string;errcode:word);
begin
  writeln(#13#10,msg);
  halt(errcode);
end;
 
procedure opensocket(socketno:word);
begin
  if notrunnetw then neterror:=$f0
  else begin
    r.bx:=0;
    r.al:=openstyle;
    r.dx:=socketno;
    intr($7a,r);
    neterror:=r.al;
  end;
end;
 
procedure closesocket(socketno:word);
begin
  if notrunnetw then neterror:=$f0
  else begin
    r.bx:=1;
    r.dx:=socketno;
    intr($7a,r);
    neterror:=0;
  end;
end;
 
procedure sendpacket(var ecb:tecb);
var
  len:word;
begin
  if notrunnetw then neterror:=$f0
  else begin
    r.bx:=3;
    r.es:=seg(ecb);
    r.si:=ofs(ecb);
    intr($7a,r);
    neterror:=r.al;
  end;
end;
 
procedure receivepacket(var ecb:tecb);
var
  len:word;
begin
  if notrunnetw then neterror:=$f0
  else begin
    r.bx:=4;
    r.es:=seg(ecb);
    r.si:=ofs(ecb);
    intr($7a,r);
    neterror:=r.al;
  end;
end;
 
procedure cancelevent(var ecb:tecb);
begin
  if notrunnetw then neterror:=$f0
  else begin
    r.bx:=6;
    r.es:=seg(ecb);
    r.si:=ofs(ecb);
    intr($7a,r);
    neterror:=r.al;
  end;
end;
 
procedure ipxinitialize;
begin
  getintvec($7a,int7a);
  notrunnetw:=ofs(int7a^)=0;
  if notrunnetw then neterror:=$f0
  else neterror:=0;
end;
 
begin
  ipxinitialize;
end.