Имеется два приложения--одно из них серверное(главное), второе - клиентское(не главное). Передача данных т.е. сообщений осуществляется по каналу через протокол NetBios (передача данных вернее сообщений работает хорошо)..Но нужно модернизировать программу т.е. вывести информацию о канале и информацию о сетевом адаптере - пользователю. Как это осуществить?
серверное прил:
program netbios;
uses crt, dos;
type
ncb = record
Cmd: byte;
CCode: byte;
LocalSessionNumber: byte;
NetworkNameNumber: byte;
BufOfs: word;
BufSeg: word;
Size: word;
CallName: array[1..16] of char;
OurName: array[1..16] of char;
ReceiveTimeout: byte;
SendTimeout: byte;
PostRoutineOfs: word;
PostRoutineSeg: word;
AdapterNumber: byte;
FinalCCode: byte;
Reserved: array[1..14] of char;
end;
var
ncbrec: ncb;
procedure Dobavit;
var
regs: registers;
begin
regs.ES := seg(ncbrec);
regs.BX := ofs(ncbrec);
FillChar(ncbrec.OurName, 16, 's');
ncbrec.Cmd := $30;
ncbrec.AdapterNumber := 0;
Intr($5c, regs);
end;
procedure Udalit;
var
regs: registers;
begin
regs.ES := seg(ncbrec);
regs.BX := ofs(ncbrec);
ncbrec.Cmd := $31;
intr($5c, regs);
end;
procedure Call; {procedura sozdanija kanala}
var
regs: registers;
begin
regs.ES := seg(ncbrec);
regs.BX := ofs(ncbrec);
ncbrec.cmd := $10; {v 'Cmd' zanosim kod komandi 'CallW'}
FillChar(ncbrec.CallName, 16, 'r'); {v 'Call' zanosim imya s kem budet sozdan kanal}
intr($5c,regs); {prerivanije}
end;
procedure HangUp; {procedura razriva kanala}
var
regs: registers;
begin
regs.ES := seg(ncbrec);
regs.BX := ofs(ncbrec);
ncbrec.cmd := $12;
intr($5c, regs);
end;
procedure Send; {procedura otpravki dannih v kanal}
var
regs:registers;
str: string;
begin
write('Vvedite soobsch: ');
readln(str); {schitivaem vvedennije polzovatelem dannije dlya otpravki}
regs.ES := seg(ncbrec);
regs.BX := ofs(ncbrec);
ncbrec.Cmd := $14; {v 'Cmd' zanosim kod komandi 'SendW'}
ncbrec.Size := length(str) + 1; {razmer dannih dlya otpravki}
ncbrec.BufOfs := ofs(str); {ukazivaem smeschenije bufera kotoriy soderzhit dannije dlya otpravki}
ncbrec.BufSeg := seg(str); {ukazivaem segment bufera}
intr($5c, regs); {vizov prerivanija}
end;
begin
with ncbrec do
begin
Cmd := 0;
CCode := 0;
LocalSessionNumber := 0;
NetworkNameNumber := 0;
BufOfs := 0;
BufSeg := 0;
Size := 0;
ReceiveTimeout := 0;
SendTimeout := 0;
PostRoutineOfs := 0;
PostRoutineSeg := 0;
AdapterNumber := 0;
FinalCCode := 0;
end;
clrscr;
Dobavit; {dobavlyaem imya v tablicu imen}
writeln('Dobavleno imya: ', ncbrec.FinalCCode);
writeln('Adapter Number: ', ncbrec.AdapterNumber);
writeln;
if ncbrec.FinalCCode = 0 then begin {esli oshibok net to ->}
Call; {organizuem kanal}
writeln('Call: ',ncbrec.FinalCCode);
writeln;
Send; {otpravlyam dannije v kanal}
writeln;
writeln('Soobsch otpravleno: ',ncbrec.FinalCCode);
writeln;
HangUp; {razriv kanal}
writeln('Hang up: ',ncbrec.FinalCCode);
writeln;
end;
Udalit; {udalyaem imya iz tablici imen}
writeln('Udaleno: ',ncbrec.FinalCCode);
readln;
end.
клиенсткое прил:
program netbios;
uses crt, dos;
type
ncb = record {objavlenije setevogo upravlayuschego bloka i ego peremennih}
Cmd: byte;
CCode: byte;
LocalSessionNumber: byte;
NetworkNameNumber: byte;
BufOfs: word;
BufSeg: word;
Size: word;
CallName: array[1..16] of char;
OurName: array[1..16] of char;
ReceiveTimeout: byte;
SendTimeout: byte;
PostRoutineOfs: word;
PostRoutineSeg: word;
AdapterNumber: byte;
FinalCCode: byte;
Reserved: array[1..14] of char;
end;
var
ncbrec: ncb;
procedure Dobavit; {procedura doabavlenija imeni iz peremennoy 'OurName' v tablicu imen}
var
regs: registers;
begin
regs.ES := seg(ncbrec);
regs.BX := ofs(ncbrec);
FillChar(ncbrec.OurName, 16, 'r');
ncbrec.Cmd := $30;
ncbrec.AdapterNumber := 0;
Intr($5c, regs);
end;
procedure Udalit; {procedura udalenija imeni iz tablici imen}
var
regs: registers;
begin
regs.ES := seg(ncbrec);
regs.BX := ofs(ncbrec);
ncbrec.Cmd := $31;
intr($5c,regs);
end;
procedure Listen; {procedora dlya organizacii kanala,ona budet nahoditsya
v ozhidanii poka server ne pozhelaet sozdat kanal}
var
regs: registers;
begin
regs.ES := seg(ncbrec);
regs.BX := ofs(ncbrec);
ncbrec.cmd := $11; {v 'Cmd' zanosim kod komandi 'ListenW'}
FillChar(ncbrec.CallName, 16, 's'); {v 'CallName' zanosim imya 'servera' s kotorim budet organizovan kanal}
intr($5c, regs); {vizivaem prerivanije}
end;
procedure HangUp; {procedura razriva kanala}
var
regs: registers;
begin
regs.ES := seg(ncbrec);
regs.BX := ofs(ncbrec);
ncbrec.cmd := $12; { v 'Cmd' zanosim kod komandi 'HangUpW'}
intr($5c, regs); {prerivanije}
end;
procedure Polu4it; {procedura priema dannih iz kanala}
var
regs:registers;
str: string;
begin
regs.ES := seg(ncbrec);
regs.BX := ofs(ncbrec);
ncbrec.Cmd := $15; { v 'Cmd' zanosim kod komandi 'ReceiveW'}
ncbrec.Size := 32;
ncbrec.BufOfs := ofs(str); {ukazivaem smeschenije bufera,dlya priema soobschenij}
ncbrec.BufSeg := seg(str); {ukazivaem segment bufera}
intr($5c, regs); {prerivanije}
writeln('Soobsch: ', str); {vivod poluchennih dannih}
end;
begin
with ncbrec do
begin
Cmd := 0;
CCode := 0;
LocalSessionNumber := 0;
NetworkNameNumber := 0;
BufOfs := 0;
BufSeg := 0;
Size := 0;
ReceiveTimeout := 0;
SendTimeout := 0;
PostRoutineOfs := 0;
PostRoutineSeg := 0;
AdapterNumber := 0;
FinalCCode := 0;
end;
clrscr;
Dobavit; {dobavlyaem imya v tablicu imen}
writeln('Dobavleno imya: ', ncbrec.FinalCCode);
writeln('Adapter Number: ', ncbrec.AdapterNumber);
writeln;
if ncbrec.FinalCCode = 0 then begin {esli pri dobavlenii imeni ne vozniklo oshibok to ->}
Listen; {vizov proceduri ozhidanija servera dalya sozdanija kanala}
writeln('Listen: ',ncbrec.FinalCCode);
writeln;
writeln('Nazhmite "Enter" pri gotovnosti priema...');
readln;
Polu4it; {procedura schitavanija dannih iz kanala}
writeln;
writeln('Polu4eno: ',ncbrec.FinalCCode);
writeln;
HangUp; {razriv kanala}
writeln('Hang up: ',ncbrec.FinalCCode);
writeln;
end;
Udalit; {udalenije imeni iz tablici imen}
writeln('Udaleno imya: ',ncbrec.FinalCCode);
readln;
end.