Всем привет..Задача:
Имеется два приложения--одно из них серверное(главное), второе - клиентское(не главное). Передача данных т.е. сообщений осуществляется по каналу через протокол 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.