¦ ¦
¦ ¦Сеть IP=129.1.0.0
-----------+----------------T------+-------------------
129.1.03 ¦
г========¦=========¬
¦ Сервер NetWare ¦
L=========T========-
¦
Сеть IPX = 84404556 ¦ Сеть Token Ring
------------------------+-----------------------¬
L------T------------------------------------T----
¦ ¦
-------+-------¬ -------+-------¬
¦Клиент NetWare¦ ¦Клиент NetWare¦
L--------------- L---------------
Рис.3.8.
Есть возможность маршрутизации пакетов IP через сервер NetWare.
На рис.3.9. TCP/IP в сервере Netware 1 обеспечивают маршрутизацию
пакетов IP, давая возможность клиентам UNIX из сети IP Ethernet
работать с сервером Netware 2.
Маршрутизация пакетов IP через сервер NetWare
---------------------¬ --------------¬
¦Рабочая станция UNIX¦ ¦ Сервер UNIX ¦
L---------T----------- L-----T--------
¦129.1.0.2 ¦129.1.0.1
¦ ¦
¦ ¦Сеть IP=129.1.0.0
-----------+----------------T------+-------------------
129.1.03 ¦
г========¦=========¬
¦ Сервер NetWare 1¦
L=========T========-
¦
Сеть IPX = 84404556 ¦ Сеть Token Ring
------------------------+-----------------------¬
L----T------------------T-----------------T------
¦ ¦ ¦
-------+-------¬ г=======¦========¬ -------+-------¬
¦Клиент NetWare¦ ¦Сервер NetWare 2¦ ¦Клиент NetWare¦
L--------------- L================- L---------------
Рис.3.9.
Включив в состав сети IP, изображенной на рис.3.10.-, маршрути-
затор IP можно обеспечить выход в глобальную интерсеть IP.
Средства прокладки туннелей IP обеспечивают прозрачное взаимо-
действие сетей IPX через интерсеть IP. Туннель IP представляет
стандартный интерфейс драйвера локальной сети для системы NetWare.
Сама интерсеть IP является средой передачи. В этом смысле адрес IP
выполняет в среде IP ту же функцию, что физический адрес в физи-
ческой среде. Пример использования туннеля IP для взаимодействия
сетей IPX через интерсеть IP приведен на рис.3.10.
Взаимодействие сетей NetWare через туннель IP
Туннель IP г============¬
¦ ¦ Сеть IPX ¦
¦ L======T=====-
¦ ¦
-----------------¬ ¦ г============¬ ----------+------¬
¦ Сервер NetWare +-+-¦Интерсеть IP¦---+ Сервер NetWare ¦
¦ +---¦ ¦-T-+ ¦
L--------T-------- L============- ¦ L-----------------
¦ ¦
¦ ¦
г========¦=======¬ Туннель IP
¦ Сеть IPX ¦
L================-
Рис.3.10.
4. ОБМЕН СООБЩЕНИЯМИ В СЕТИ.
Две программы, работающие на разных узлах сети, могут обмени-
ваться данными двумя способами: пересылка пакетов через низкоуров-
невый драйвер сети и пересылка сообщений через общий файл-сервер.
Пример программы, посылающей сообщение на консоль сервера :
Uses Dos;
var k : integer;
sendString : string;
Procedure SendToCon(Message : string);
var
reg : registers;
s : array [0..64] of byte;
i : integer;
begin
s[0] := 0;
s[1] := 4;
s[2] := $09;
s[3] := length(Message);
for i := 1 to Length(Message) do
s[i+3] := ord(Message[i]);
reg.ah := $0E1;
reg.bx := reg.ds;
reg.ds := seg(s);
reg.si := ofs(s);
intr($21,reg);
reg.ds := reg.bx;
end;
begin
If ParamCount = 0 then
begin
Writeln('Send message to console utility by S.Perevoznik, 1993');
Writeln('Usage : ssend <message>');
halt;
end;
for k := 1 to paramcount do
begin
SendString := SendString + Paramstr(k) + ' ';
end;
SendToCon(sendString);
Writeln('Message send to console ...');
end.
Для передачи сообщения конкретному пользователю можно использовать
следующие функции :
{$F+,O+}
Unit UICNet;
Interface
Uses Dos;
Function GetUserName(ConnectionNumber : byte;
Var ObjectFree : boolean) : string;
Function LocalDisk : boolean;
Procedure SendBroadcastMessage(Message:string;ConnectionNumber:byte);
Implementation
Function GetUserName(ConnectionNumber : byte;
Var ObjectFree : boolean) : string;
var
WordPtr:^Word;
r : registers;
SendPacket : array[0..4] of byte;
ReplyPacket : array[0..64] of byte;
UserName : string;
ObjectType : word;
function GetWord(P: pointer): word;
var
WordPtr :^word;
begin
WordPtr := P;
GetWord := swap(WordPtr^);
end;
begin
SendPacket[2] := $16;
SendPacket[3] := ConnectionNumber;
WordPtr := addr(SendPacket);
WordPtr^:=2;
WordPtr := addr(SendPacket);
WordPtr^ := 62;
r.ah := $e3;
r.ds := seg(SendPacket);
r.si := ofs(SendPacket);
r.es := seg(ReplyPacket);
r.di := ofs(ReplyPacket);
intr($21,r);
if r.al = 0
then
begin
ObjectType := GetWord(addr(ReplyPacket[6]));
if ObjectType = 0 then ObjectFree := true
else
ObjectFree := false;
move(ReplyPacket[8],UserName[1],48);
UserName[0] := chr(48);
GetUserName := Username;
end;
end;
Function LocalDisk : boolean;
var r : registers;
begin
r.ah := $19;
intr($21,r);
r.dl := r.al+1;
r.ah := $e9;
r.al := 0;
r.dh := 0;
intr($21,r);
if r.ah = 128 then localdisk := true
else localdisk := false;
end;
Procedure SendBroadcastMessage(Message:string; ConnectionNumber:byte);
var
r : registers;
WordPtr : ^word;
SendPacket : array [0..160] of byte;
ReplyPacket : array [0..103] of byte;
begin
SendPacket[2] := 0;
SendPacket[3] := 1;
SendPacket[4] := ConnectionNumber;
SendPacket[5] := length(Message);
move(Message[1],SendPacket[6],length(Message));
WordPtr := addr(SendPacket);
WordPtr^ := Length(Message) + 4;
r.ah := $e1;
r.ds := seg(SendPacket);
r.si := ofs(SendPacket);
r.es := seg(ReplyPacket);
r.di := ofs(ReplyPacket);
intr($21,r);
end;
end.
Следующая программа демонстрирует возможность получения списка поль-
зователей, подключенных к сети:
uses Dos;
function GetWord(P: pointer): word;
var
WordPtr :^word;
begin
WordPtr := P;
GetWord := swap(WordPtr^);
end;
Function GetLong(P:Pointer): longint;
type long= record
case integer of
1:(Long1: Longint);
2:(Word1,Word2:word);
end;
var LongPtr :^Long;
L : long;
begin
LongPtr := P;
L.Word1 := swap(LongPtr^.Word2);
L.Word2 := swap(LongPtr^.Word1);
GetLong:= L.Long1;
end;
Function GetConnectionInformation(ConnectionNumber:byte;
Var ObjectName : string; var ObjectType : word;
var ObjectID : longint; var LoginTime : string): byte;
var
WordPtr:^Word;
r:registers;
SendPacket : array[0..4] of byte;
ReplyPacket : array[0..64] of byte;
begin
SendPacket[2] := $16;
SendPacket[3] := ConnectionNumber;
WordPtr := addr(SendPacket);
WordPtr^:=2;
WordPtr := addr(SendPacket);
WordPtr^ := 62;
r.ah := $e3;
r.ds := seg(SendPacket);
r.si := ofs(SendPacket);
r.es := seg(ReplyPacket);
r.di := ofs(ReplyPacket);
intr($21,r);
if r.al = 0
then
begin
ObjectID := GetLong(addr(ReplyPacket[2]));
ObjectType := GetWord(addr(ReplyPacket[6]));
move(ReplyPacket[8],ObjectName[1],48);
ObjectName[0] := chr(48);
move(ReplyPacket[56],LoginTime[1],7);
LoginTime[0] := chr(7);
end;
GetConnectionInformation := r.al;
end;
var
ObjectName,LoginTime : string;
ObjectType : word;
ObjectID : longint;
ConnectionNumber, CCode : byte;
begin
ConnectionNumber := 1;
CCode := GetConnectionInformation(ConnectionNumber,
ObjectName,ObjectType,ObjectID,LoginTime);
while (CCode <> 253) and (ConnectionNumber<255)
do
begin
if CCode <> 0
then
writeln('Cod ',CCode,ConnectionNumber)
else if ObjectType <>0 then begin
Writeln(ConnectionNumber,' ',ObjectType,' ',ObjectID);
Writeln(ObjectName);
end;
inc(ConnectionNumber);
CCode := GetConnectionInformation(ConnectionNumber,
ObjectName,ObjectType,ObjectID,LoginTime);
end;
end.
5. РАБОТА С ФАЙЛАМИ В ЛВС.
Ниже приводятся тексты процедур, используемых при работе в ЛВС
для обслуживания файловой системы:
; Данная библиотека процедур разработана для использования в прог-
; раммах, написанных на Турбо-Паскале версии 4.0 и выше.
; Joe R. Doupnik and Sergey V. Perevoznik, 1988 - 1993
lprog equ 1 ; 0 for small memory, 1 for large memory model
; Modify lprog to match the memory model
if lprog
x equ 6 ; prologue overhead for large memory model
else
x equ 4 ; ditto, small memory model
endif
begin macro name ; begin a function, near or far
public name
if lprog
name proc far
else
name proc near
endif
endm
; define Borland Pascal segments
; use neither Group nor Class
data segment word public
data ends
cseg segment byte public
assume cs:cseg, ds:data, es:nothing
;--------------------------------
; Extended Open a File func(61) (3DH)
;
; var
; Mode, Handle, RetCode : Integer;
; Filename : String[n];
;
; RetCode := xtndopn(Mode, Handle, Filename);
;
begin xtndopn
push bp
mov bp,sp
push ds
lds si,[bp+x+8] ; put the mode in ax
mov ax,[si]
mov ah,03Dh ; put the function in ah
lds dx,[bp+x] ; ptr to ASCIIZ string
inc dx ; add 1 to get to the beginning of the string
int 21h
jc xtndopx ; carry set means failure
lds di,[bp+x+4] ; put the handle into the variable
mov [di],ax ; if there is no error and
xor ax,ax ; return a 0
xtndopx:pop ds
pop bp
ret 14
xtndopn endp
;--------------------------------
; Get or Set File Attributes(handle) func(67) (43H)
;
; var
; Func, Attribute, ErrCode : Integer;
; Filename : String[n];
;
;ErrCode := setattr(Func, Attribute, Filename);
;
begin setattr
push bp
mov bp,sp
push ds
lds si,[bp+x+8] ; put the subfunction in ax
mov ax,[si]
mov ah,043h ; put the function in ah
lds dx,[bp+x] ; ptr to var desc block for ASCIIZ string
inc dx ; add 1 to get the address of the string
lds si,[bp+x+4] ; put the attribute to set in cx
mov cx,[si]
int 21h
jc setattx ; carry set means failure
lds di,[bp+x+4] ; put the returned attributes in the
mov [di],cx ; variable if there is no error
xor ax,ax ; and return zero
setattx:mov ah,0
pop ds
pop bp
ret 14
setattr endp
;--------------------------------
; End of Job Flag Status func(187) (BBH)
;
; var
; Flag : Integer;
;
;ErrCode := eojstat(Flag);
;
begin eojstat
push bp
mov bp,sp
push ds
lds si,[bp+x] ; put the flag in ax
mov ax,[si]
mov ah,0BBh ; put the function in ah
int 21h
mov ah,0
lds di,[bp+x]
mov [di],ax
pop ds
pop bp
ret 6
eojstat endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Physical Record Lock: Log Record BCH
;
; var
; ErrCode,FileHandle,HiByteOffset,LoByteOffset : Integer
; HiLockLen,LoLockLen,Flags,TimeOut : Integer
;
;ErrCode := PRLH_Log(FileHandle,HiByteOffset,LoByteOffset,HiLockLen,
; LoLockLen,Flags,TimeOut);
;
begin PRLH_Log
push bp
mov bp,sp
push ds
lds si,[bp+x+24] ; FileHandle
mov bx,[si]
lds si,[bp+x+20] ; ByteOffset
mov cx,[si]
lds si,[bp+x+16]
mov dx,[si]
lds si,[bp+x+4] ; AL = Log Flags
mov ax,[si]
lds si,[bp+x+12] ; LockLen
mov si,[si]
lds di,[bp+x+8]
mov di,[di]
lds bp,[bp+x] ; time out
mov bp,[bp]
mov ah,0BCH
int 21H
mov ah,0 ; clear the high byte of the return
pop ds
pop bp
ret 30
PRLH_Log endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Physical Record Lock: Release Rec BDH
;
; var
; FileHandle,HiByteOffset,LoByteOffset,ErrCode,
; HiWordLen,LoWordLen : integer;
; ErrCode := PRLH_Rel(FileHandle,HiByteOffset,LoByteOffset,HiWordLen,
; LoWordLen:integer);
begin PRLH_Rel
push bp
mov bp,sp
push ds
lds si,[bp+x+16] ; FileHandle
mov bx,[si]
lds si,[bp+x+12] ; HiByteOffset
mov cx,[si]
lds si,[bp+x+8] ; LoByte
mov dx,[si]
lds si,[bp+x+4] ; HiWordLen
mov si,[si]
lds di,[bp+x] ; LoWordLen
mov di,[di]
mov ah,0BDH
int 21H
mov ah,0
pop ds
pop bp
ret 22
PRLH_Rel endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Physical Record Lock: Release Clr BEH
;
; var
; FileHandle,HiByteOffset,LoByteOffset,ErrCode,
; HiWordLen,LoWordLen : integer;
; ErrCode := PRLH_Rel(FileHandle,HiByteOffset,LoByteOffset,HiWordLen,
; LoWordLen:integer);
;
begin PRLH_Clr
push bp
mov bp,sp
push ds
lds si,[bp+x+16] ; FileHandle
mov bx,[si]
lds si,[bp+x+12] ; ByteOffset
mov cx,[si]
lds si,[bp+x+8]
mov dx,[si]
lds si,[bp+x+4] ; HiWordLen
mov si,[si]
lds di,[bp+x] ; LoWordLen
mov di,[di]
mov ah,0BEH
int 21H
mov ah,0
pop ds
pop bp
ret 22
PRLH_Clr endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Physical Record Lock: Log Rec FCB BFH
;
; var
; ErrCode,fcb,HiByteOffset,LoByteOffset : Integer;
; HiLockLen,LoLockLen,Flags,TimeOut : Integer;
;
; ErrCode := PRLF_Log(fcb,HiByteOffset,LoByteOffset,HiLockLen,LoLockLen,Flags,TimeOut);
;
begin PRLF_Log
push bp
mov bp,sp
push ds
lds si,[bp+x+24] ; FCB
mov dx,[si]
lds si,[bp+x+20] ; ByteOffset
mov bx,[si]
lds si,[bp+x+16]
mov cx,[si]
lds si,[bp+x+4] ; AL = Log Flags
mov ax,[si]
lds si,[bp+x+8] ; low lock length
mov di,[si]
lds si,[bp+x+12] ; hi lock length
mov si,[si]
mov bp,[bp+x] ; timeout value
mov bp,[bp]
mov ah,0BFH
int 21H
mov ah,0
pop ds
pop bp
ret 28
PRLF_Log endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Physical Record Lock: Rel Rec FCB C0H
;
; var
; ErrCode,fcb,HiByteOffset,LoByteOffset : Integer;
;
; ErrCode := PRLF_Rel(fcb,HiByteOffset,LoByteOffset);
;
begin PRLF_Rel
push bp
mov bp,sp
push ds
lds dx,[bp+x+8] ; FCB
lds si,[bp+x+4] ; ByteOffset
mov bx,[si]
lds si,[bp+x]
mov cx,[si]
mov ah,0C0H
int 21H
mov ah,0