LABORATORIUM SIECI KOMPUTEROWYCH
Laboratorium 3. Protokół NetBIOS – podstawowe operacje.
WERSJA ROBOCZA
Cel ćwiczenia
Celem ćwiczenia jest napisanie programu w języku C którego zadaniem jest dodanie unikatowej nazwy węzła a następnie usunięcie jej z lokalnej tabeli nazw NetBIOSa.
Wprowadzenie do programowania z użyciem protokołu NetBIOS
NetBIOS - Network Basic Input Output System, został opracowany przez firmy IBMi Sytek Inc. (obecnie Hughes LAN Systems Inc. Mountain View, Kalifornia) jako część programu IBM PC Network. Podobnie jak ROMBIOS pozwala systemowi operacyjnemu komputera PC oraz aplikacjom na dostęp do lokalnych urządzeń I/O, Net-BIOS
zapewnia aplikacjom dostęp do urządzeń sieciowych. Protokół NetBIOS, traktowany jako warstwa sesji modelu odniesienia OSI, stał się de facto standardem. Ekspansja sieci LAN i łączenie ich w większe struktury sieciowe oraz popularność TCP/IP jako podstawowego protokołu sieci Internet wymusiły dopasowanie interfejsu NetBIOS do pracy ponad protokołami sieci Internet. Z punktu widzenia architektury systemu, połączenie obsługi protokołu NetBIOS, pracującego w warstwie sesji modelu OSI, z protokołami TCP lub UDP, działającymi w warstwie transportowej, jest naturalnym sposobem obsługi wielu istniejących aplikacji LAN, działających w rozproszonym środowisku sieciowym.
Podobnie jak w przypadku ROMBIOS, który dostarczany jest przez wielu producentów wraz z komputerami PC, producenci systemów operacyjnych działających w sieciach LAN również stworzyli własne implementacje NetBIOS.
Protokół NetBIOS obsługuje cztery typy podstawowych działań:
• Name Service,
• Sesion Service,
• Datagram Service,
• Miscellaneous functions.
Aplikacje wykorzystują te usługi do odszukania zasobów w sieci, nawiązania i zakończenia połączenia oraz do przesyłania danych. Obsługa systemu nazw pozwala na odwoływanie się do aplikacji posiadającej pewne zasoby poprzez określoną nazwę stosowaną w sieci. Składa się ona z 16 znaków alfanumerycznych, które mogą być albo wyłączne (tylko dla danej aplikacji), albo współdzielone (wykorzystywane przez grupę).
Aplikacja rejestruje daną nazwę, aby upewnić się, czy żadna inna aplikacja nie ma nic przeciwko jej wykorzystaniu. Podstawowe działania usługi nazewnictwa to: Add Name, Add Group Name oraz Delete Name.
Przebieg ćwiczenia laboratoryjnego
1. Uruchomić i przetestować program z instrukcji.
2. Przykład programu do obsługi NetBIOSa.
#include <windows.h>
#include <nb30.h>
#include <stdio.h>
POLITECHNIKA ŚWIĘTOKRZYSKA
KIELCE 2011 OPRACOWAŁ: mgr inż. Tomasz KWAŚNIEWSKI
LABORATORIUM SIECI KOMPUTEROWYCH
Laboratorium 3. Protokół NetBIOS – podstawowe operacje.
WERSJA ROBOCZA
//
// Wyliczanie wszystkich LANA i reset każdego
//
int LanaEnum(LANA_ENUM *lenum)
{
NCB ncb;
ZeroMemory(&ncb, sizeof(NCB)); // Przygotowanie pamięci pod
strukturę NCB
ncb.ncb_command = 0x37; // Wydanie rozkazu NCBENUM
ncb.ncb_buffer = (PUCHAR)lenum;
ncb.ncb_length = sizeof(LANA_ENUM);
if (Netbios(&ncb) != NRC_GOODRET)
{
printf("ERROR: Netbios: NCBENUM: %d\n", ncb.ncb_retcode);
return ncb.ncb_retcode;
}
return NRC_GOODRET;
}
//Resetowanie każdego LANA znajdujących się w strukturze LANA_ENUM.
int ResetAll(LANA_ENUM *lenum, UCHAR ucMaxSession, UCHAR ucMaxName, BOOL
bFirstName)
{
NCB ncb;
int i;
ZeroMemory(&ncb, sizeof(NCB)); // Przygotowanie pamięci pod strukturę
NCB
ncb.ncb_command = 0x32; // Wydanie rozkazu NCBRESET
ncb.ncb_callname[0] = ucMaxSession;
ncb.ncb_callname[2] = ucMaxName;
ncb.ncb_callname[3] = (UCHAR)bFirstName;
for(i = 0; i < lenum->length; i++)
{
ncb.ncb_lana_num = lenum->lana[i];
if (Netbios(&ncb) != NRC_GOODRET)
{
printf("ERROR: Netbios: NCBRESET[%d]: %d\n", ncb.ncb_lana_num,
ncb.ncb_retcode);
return ncb.ncb_retcode;
}
}
return NRC_GOODRET;
}
int main(void)
{
LANA_ENUM lenum;
if (LanaEnum(&lenum) != NRC_GOODRET)
return 1;
if (ResetAll(&lenum, 254, 254, FALSE) != NRC_GOODRET)
return 1;
//
POLITECHNIKA ŚWIĘTOKRZYSKA
KIELCE 2011 OPRACOWAŁ: mgr inż. Tomasz KWAŚNIEWSKI
LABORATORIUM SIECI KOMPUTEROWYCH
Laboratorium 3. Protokół NetBIOS – podstawowe operacje.
WERSJA ROBOCZA
// Dodanie nazwy jako unikatowej - ADDNAME
//
…
…
…
system("pause");
//
// Usunięcie dodanej nazwy - DELNAME
//
…
…
…
system("pause");
}
Uwaga !
Do programu należy dołączyć bibliotekę - netapi32.
3. Dodać do programu funkcję która będzie dodawać nazwy węzłów do tabeli nazw NetBIOSa. Komenda – NCBADDNAME lub 0x30.
//Dodaj podaną nazwą do liczby LANA.
int AddName(int lana, char *name, int *num)
{
NCB ncb;
ZeroMemory(&ncb, sizeof(NCB));
…
…
…
return NRC_GOODRET;
}
4. Dodać do programu funkcję która będzie usuwać nazwy węzłów z tabeli nazw NetBIOSa. Komenda – NCBDELNAME lub 0x31.
//Usuń podaną nazwie z tabeli NetBIOS powiązaną z numerem LANA.
int DelName(int lana, char *name)
{
NCB ncb;
ZeroMemory(&ncb, sizeof(NCB));
…
…
…
return NRC_GOODRET;
}
5. Kolejność wykonywania funkcji programu głównego.
• Reset węzła Netbios (RESET).
• Pobranie łańcucha tekstowego od użytkownika (nazwa dla węzła).
• Dodanie nazwy jako unikatowej (ADDNAME).
POLITECHNIKA ŚWIĘTOKRZYSKA
KIELCE 2011 OPRACOWAŁ: mgr inż. Tomasz KWAŚNIEWSKI
LABORATORIUM SIECI KOMPUTEROWYCH
Laboratorium 3. Protokół NetBIOS – podstawowe operacje.
WERSJA ROBOCZA
• 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ę)
• Usunięcie dodanej nazwy (DELETENAME)
Sprawozdanie
W sprawozdaniu należy zamieścić opis poszczególnych funkcji NetBIOSa, opisanie kodu programu oraz przedstawienie działającego programu wraz z efektem jego pracy.
Dodatkowe informacje
Kody odpowiedzi NetBIOSa umieszczane w polu NCB_RETCODE
00 polecenie wykonane poprawnie
01 błędna wielkość bufora dla użytego zlecenia
03 nie istniejący kod zlecenia
05 zadziałanie budzika związanego ze zleceniem
06 odebranie tylko części wiadomości (za mały bufor)
08 brak połączenia o podanym identyfikatorze
09 brak zasobów na nawiązanie połączenia
0A połączenie rozwiązane
0B zlecenie skasowane
0D powielenie nazwy występującej już w loklanej tablicy nazw
0E zapełniona tablica nazw
0F nazwa wskazana do usunięcia jest związana z aktywnym połączeniem
11 zapełniona loklana tablica połączeń
12 odrzucenie propozycji nawiązania połączenia (brak LISTEN po drugiej stronie)
13 błędny identyfikator nazwy
14 brak partnera o podanej nazwie
15 brak określonej nazwy loklanej lub niedopuszczalna postać nazwy
16 powielenie nazwy już używanej przez jakąś zdalną stację
17 nazwa usunięta
18 rozwiązanie połączenia w sposób nienormalny
19 wykrycie konfliktu nazw
1A ramka o nieprawidłowym formacie
21 zajęty styk NetBIOSa (niedozwolone wywołanie NetBIOSa z procedury obsługi przerwania
22 zbyt wiele zleceń
23 błędna liczba w polu NCB_LANA_NUM (numer karty sieciowej)
24 próba skasowania zlecenia wykonanego lub nie wydanego
26 próba skasowania zlecenia, którego nie wolno kasować
4* niespodziewana sytuacja w sieci
50-FE błędne działanie karty sieciowej
FF zlecenie jest trakcie realizacji
POLITECHNIKA ŚWIĘTOKRZYSKA
KIELCE 2011 OPRACOWAŁ: mgr inż. Tomasz KWAŚNIEWSKI
LABORATORIUM SIECI KOMPUTEROWYCH
Laboratorium 3. Protokół NetBIOS – podstawowe operacje.
WERSJA ROBOCZA
Struktura NCB (NetBIOS Controll Block)
Struktura NCB (NetBIOS Controll Block) służy do przekazywania do styku NetBIOSa poleceń wraz z parametrami a w drugą stronę odpowiedzi NetBIOSa. Zajmuje 64 bajty pamięci. Pamięć ta powinna być przed wydaniem polecenia wyczyszczona przez aplikację.
Struktura ta składa się z szeregu pól, które należy wypełnić zależnie od określonego polecenia.
Deklaracja struktury NCB dla NetBIOSu.
typedef struct _NCB {
UCHAR ncb_command;
UCHAR ncb_retcode;
UCHAR ncb_lsn;
UCHAR ncb_num;
PUCHAR ncb_buffer;
WORD ncb_length;
UCHAR ncb_callname[NCBNAMSZ];
UCHAR ncb_name[NCBNAMSZ];
UCHAR ncb_rto;
UCHAR ncb_sto;
void (CALLBACK *ncb_post)(struct _NCB*);
UCHAR ncb_lana_num;
UCHAR ncb_cmd_cplt;
UCHAR ncb_reserve[10];
HANDLE ncb_event;
} NCB,*PNCB;
Opis poszczególnych pól struktury NetBIOSa
NCB_COMMAND
Pole kodu zlecenia.
NCB_RETCODE
Pole kodu odpowiedzi NetBIOSa (patrz kody błędów).
NCB_LSN
Identyfikator połączenia. NetBIOS po nawiązaniu połączenia (poleceniami CALL lub LISTEN) nadaje temu połączeniu unikalny identyfikator (lokalny dla danego komputera!).
Identyfikator ten w kolejnych poleceniach służy do wskazania właściwego połączenia.
NCB_NUM
Identyfikator nazwy. NetBIOS po zarejestrowaniu nazwy nadaje jej unikalny identyfikator (lokalny dla danego komputera), który aplikacja może odczytać z pola NCB_NUM po wykonaniu polecenia ADD NAME lub ADD GROUP NAME. Identyfikator ten
wykorzystywany jest w kilku poleceniach (np. SEND DATAGRAM) do wskazania określonej nazwy lokalnej.
POLITECHNIKA ŚWIĘTOKRZYSKA
KIELCE 2011 OPRACOWAŁ: mgr inż. Tomasz KWAŚNIEWSKI
LABORATORIUM SIECI KOMPUTEROWYCH
Laboratorium 3. Protokół NetBIOS – podstawowe operacje.
WERSJA ROBOCZA
NCB_BUFFER
Wskaźnik na bufor na dane (ramka lub struktura z odpowiedzią). Adres jest zapisany w postaci segment:offset.
NCB_LENGTH
Długość bufora. Dla rozkazów odbierających dane (np. RECEIVE DATAGRAM) aplikacja deklaruje maksymalną wielkość bufora a NetBIOS po wpisaniu do bufora odebranych danych wpisuje do tego pola ich właściwą długość.
NCB_CALLNAME
Nazwa zdalna.
NCB_NAME
Nazwa lokalna.
NCB_RTO
Wartość timeout'u dla zlecenia RECEIVE. Wartość jest ustawiana w rozkazie nawiązującym połączenie (CALL lub LISTEN) i obowiązuje dla wszystkich poleceń RECEIVE wydanych dla tego połączenia. Jednostką czasu jest 500ms.
NCB_STO
Wartość timeout'u dla zleceń SEND i CHAIN SEND. Wartość ustawiana w rozkazie nawiązującym połączenie (CALL lub LISTEN) i obowiązuje dla wszystkich poleceń typu SEND w tym połączeniu. Jednostka czasu to 500ms.
NCB_POST
Adres procedury wywoływanej przez NetBIOSa po zakończeniu realizacji danego polecenia.
Adres procedury ma postać segment:offset. Procedura powinna być możliwie krótka i nie może wywoływać NetBIOSa. Mechanizm zostaje zablokowany gdy adres ma wartość 0000:0000.
NCB_LANA_NUM
Numer karty sieciowej. W oryginalnym rozwiązaniu IBM można było mieć w komputerze maksymalnie dwie karty sieciowe. W systemie Windows pod pojęciem "karta sieciowa" kryje się karta logiczna a więc połączenie karty fizycznej z protokołem. Zatem w systemie z jedną fizyczną kartą i protokołami: NetBIOS/NetBEUI, NetBIOS przez IPX i NetBIOS przez TCP/IP emulator NetBIOSa obsługuje trzy "karty".
NCB_CMD_CPLT
Pole robocze NetBIOSa zawierające taką samą wartość jak pole NCB_RETCODE.
POLITECHNIKA ŚWIĘTOKRZYSKA
KIELCE 2011 OPRACOWAŁ: mgr inż. Tomasz KWAŚNIEWSKI