IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Передача сообщения, Создание канала передачи данных
dron4ik
сообщение 11.03.2011 21:38
Сообщение #1


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


Всем привет..Задача:

Имеется два приложения--одно из них серверное(главное), второе - клиентское(не главное). Передача данных т.е. сообщений осуществляется по каналу через протокол 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 8.08.2025 9:01
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"