Sieci komputerowe - Ćwiczenie 2
Forma zaliczenia: zademonstrowanie działającego programu na koniec zajęć i
objaśnienie jego konstrukcji/działania (bez sprawozdania).
Temat: Bazując na materiałach opisujących Netbios udostępnionych przed
zajęciami przez prowadzącego oraz wskazówkach umieszczonych na końcu tej
instrukcji napisz program (w języku C lub w Pascalu) dodający unikatową
nazwę węzła (komputera, na którym go uruchomiono) do lokalnej tabeli nazw
Netbiosa. Na koniec działania program ma usuwać dodaną nazwę z tabeli nazw.
Ogólny wymagany schemat działania programu:
1. Reset węzła Netbios (RESET).
2. Pobranie łańcucha tekstowego od użytkownika (nazwa dla węzła).
3. Dodanie nazwy jako unikatowej (ADDNAME).
4. Wstrzymanie działania programu do momentu naciśnięcia dowolnego klawisza
przez użytkownika (w tym momencie polecenie nbtstat -n wydane w wierszu
poleceń powinno wyświetlić dodaną nazwę)
5. Usunięcie dodanej nazwy (DELETENAME)
WSKAZÓWKI zakładamy, że funkcje są wykonywane w trybie wait (synch.)
Przed rozpoczęciem korzystania z Netbiosa (przed wywołaniem jakiejkolwiek
funkcji) zaleca się wyzerowanie obszaru zmiennej przechowującej blok NCB (w
Pascalu można użyć procedury FillChar(), w C memset())
W celu ustalenia numeru przydzielonego karcie sieciowej (interfejsowi
sieciowemu) przez Netbios należy skorzystać z dołączonego programu
lananum.exe . Informacja ta jest potrzebna do wypełnienia pola
ncb_lana_num struktury NCB (nieprawidłowa wartość uniemożliwi skorzystanie
z jakiejkolwiek funkcji Netbiosa).
Nazwa dla węzła pobrana od użytkownika nie powinna być dłuższa niż 15
znaków. Proszę pamiętać, że zmienna typu String w Pascalu nie spełnia
wymagań formatu ASCIIZ (w pierwszym polu indeks 0 zawarta jest
informacja o długości łańcucha a nie znak). Należy więc dokonać
odpowiedniego przepisania znaków (i pamiętać o znaku pustym na końcu!).
Język C eliminuje ten problem tam wszystkie łańcuchy są w formacie ASCIIZ.
Zatrzymanie programu konsolowego w języku C najłatwiej zrealizować funkcją
'system( pause );'
Po wywołaniu każdej funkcji Netbiosa należy sprawdzić jej kod powrotu (kod
błędu), żeby się upewnić co do powodzenia podjętego działania (patrz
przykład implementacji funkcji Send poniżej oraz w dokumencie Netbios-2.pdf)
Dla programu pisanego w języku C należy pamiętać o dołączeniu do kompilacji
biblioteki netapi32 (w Dev-C++ jej odpowiednik to libnetapi32.a - W
ŚRODOWISKU dEV-c++ można ją dodać poprzez menu Projekt -> Opcje projektu ->
wpis do okienka Opcje konsolidatora/linkera)
Polecane zródła: materiały pomocnicze udostępnione tydzień przed zajęciami,
dokumenty dołączone do niniejszej instrukcji.
Przykład funkcji Send() zrealizowanej w języku C:
UCHAR Send(UCHAR nr_sesji, PUCHAR dane, WORD ilosc, NCB *blok)
/* wysłanie danych w ramach sesji o podanym numerze, sesja musi być uprzednio
nawiązana */
{
ZerujNCB(blok);
blok->ncb_command = NCBSEND;
blok->ncb_lsn = nr_sesji;
blok->ncb_buffer = dane;
blok->ncb_length = ilosc;
blok->ncb_lana_num = 0x03;
Netbios(blok);
return blok->ncb_retcode;
}
Opracowan i e Robe r t Tomaszewsk i
Szkielety początku programu dodającego nazwę węzła do tabeli nazw
Netbiosa
Pascal
type
{ Struktura NCB dla NetBiosu }
TypNCB = record
ncb_command : Byte;
ncb_retcode : Byte;
ncb_lsn : Byte;
ncb_num : Byte;
ncb_buffer : Pointer;
ncb_length : Word;
ncb_callname : array [1..16] of Byte;
ncb_name : array [1..16] of Byte;
ncb_rto : Byte;
ncb_sto : Byte;
ncb_post : Pointer; {adres ewentualnej proc. Post}
ncb_lana_num : Byte;
ncb_cmd_cplt : Byte;
ncb_reserved : array [1..14] of Byte;
end;
var
NCB_nadawcy : TypNCB;
nr_nazwy, i : Byte;
nadawca : String[15];
komunikat : String[50];
begin
ResetAdapter(NCB_nadawcy); {Reset węzła}
Write('Podaj nazwe wezla-nadawcy: ');
Readln(nadawca);
i:=AddName(nadawca,NCB_nadawcy);
if i<>0 then begin
Writeln('Blad przydzielania nazwy !');
OpisBledu(i);
ReadKey;
Halt;
end;
nr_nazwy:=NCB_nadawcy.ncb_num;
...
C
#include
#include
#include
int main(void)
{
UCHAR err, nr_odb, odb[16];
NCB blok; /* typ NCB jest predefiniowany */
err = ResetAdapter(&blok); /* reset netbiosa */
if (err != NRC_GOODRET)
{
printf("Blad resetowania!\n");
OpisBledu(err);
system("pause");
exit(1);
}
printf("Podaj nazwe wezla-odbiorcy (max. 15 znakow):");
scanf("%s",odb);
err = AddName(odb, &blok); /* dodanie unikatowej nazwy dla odbiorcy */
Opracowan i e Robe r t Tomaszewsk i
if (err != NRC_GOODRET)
{
printf("Blad dodawania nazwy odbiorcy!\n");
OpisBledu(err);
system("pause");
exit(1);
}
nr_odb = blok.ncb_num; /* zapamiętujemy przydzielony do nazwy numer */
...
Opracowan i e Robe r t Tomaszewsk i
Wyszukiwarka
Podobne podstrony:
sk2[184]
SK2
SK2
SK2
SK2
sk2
więcej podobnych podstron