Смекни!
smekni.com

Интранет сети (стр. 6 из 8)

¦ ¦

¦ ¦Сеть 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