Twoim problemem jest to, że powszechną NICOŚĆ mylisz z osobistą PUSTKĄ

1.       NetBIOS

Struktura NCB:

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;

UCHAR ncb_lana_num;

} NCB;

Opis pól:

a)      ncb_command –pole zawierające kod lub mnemonik odpowiedniego polecenia

b)      ncb_retcode – pole zawierające kod zwracany przez NetBiosa

c)      ncb_lsn – pole zawierające identyfikator połączenia, nadawany przez NetBios po nawiązaniu połączenia

d)      ncb_num -  pole zawierające identyfikator nazwy, nadawany przez NetBios po nadaniu nazwy (ADD NAME lub ADD GROUP NAME)

e)      ncb_buffer – wskaźnik na bufor danych

f)       ncb_length – pole zawierające długość bufora danych

g)      ncb_callname – pole zawierające nazwę zdalną, tj. nazwę odbiorcy lub nadawcy, używane przy transmisji połączeniowej

h)      ncb_name – nazwa lokalna, nadawana przez ADD NAME lub ADD GROUP NAME, nazwa węzła

i)        ncb_rto – czas oczekiwania na odbiór (receive time-out)

j)        ncb_sto – czas oczekiwania na wysyłkę (send time-out)

k)      ncb_lana_num – numer karty sieciowej

Najważniejsze możliwości ustawienia pola ncb_command:

a)      ncb_command = NCBRESET – resetowanie węzła NetBios

b)      ncb_command = NCBADDNAME – nadanie nazwy unikatowej węzła

c)      ncb_command = NCBADDGRNAME – nadanie nazwy grupowej

d)      ncb_command = NCBDELNAME – usunięcie nazwy węzła

e)      ncb_command = NCBDGSENDBC – broadcastowa wysyłka datagramu (do wszystkich)

f)       ncb_command = NCBDGRECVBC – odbiór broadcastowego datagramu

g)      ncb_command = NCBDGSEND – unicastowa lub multicastowa wysyłka datagramu (do konkretnego węzła lub grupy węzłów)

h)      ncb_command = NCBDGRECV – odbiór unicastowego lub multicastowego datagramu

i)        ncb_command = NCBCALL – nawiązanie sesji (połączenia) po stronie nadawcy

j)        ncb_command = NCBLISTEN – nawiązanie sesji (połączenia) po stronie odbiorcy

k)      ncb_command = NCBSEND – wysłanie danych za pomocą sesji

l)        ncb_command = NCBRECV – odebranie danych za pomocą sesji

m)    ncb_command = NCBHANGUP – zerwanie sesji (połączenia), po stronie nadawcy lub odbiorcy, nie obu

Szkielety programów:

1)      Transmisja broadcastowa

a)      Nadawca

 

1.Reset węzła (RESET)

2.Pobranie od użytkownika i nadanie unikatowej nazwy węzła (ADDNAME)

3.Pobranie danych do wysyłki i wysyłka broadcastowego datagramu (SENDBROADCASTDATAGRAM)

4.Usunięcie nazwy węzła (DELETENAME)

                            b)               Odbiorca

1.Reset węzła (RESET)

2.Pobranie od użytkownika i nadanie unikatowej nazwy węzła (ADDNAME)

3.Odbiór broadcastowego datagramu (RECEIVEBROADCASTDATAGRAM) i wyświetlenie otrzymanych danych

4.Usunięcie nazwy węzła (DELETENAME)

 

2)      Transmisja unicastowa lub multicastowa

a)      Nadawca

 

1.Reset węzła (RESET)

2.Pobranie od użytkownika i nadanie unikatowej nazwy węzła (ADDNAME)

3.Pobranie danych do wysyłki

4.Pobranie nazwy odbiorcy 

5.Wysyłka datagramu (SENDDATAGRAM)

6.Usunięcie nazwy węzła (DELETENAME)

              b)              Odbiorca unicastowy

1.Reset węzła (RESET)

2.Pobranie od użytkownika i nadanie unikatowej nazwy węzła (ADDNAME)

4.Odbiór datagramu (RECEIVEDATAGRAM)

5.Wyświetlenie otrzymanych danych

6.Usunięcie nazwy węzła (DELETENAME)

 

              c)              Odbiorca multicastowy

1.Reset węzła (RESET)

2.Pobranie od użytkownika i nadanie grupowej nazwy (ADDGROUPNAME)

4.Odbiór datagramu (RECEIVEDATAGRAM)

5.Wyświetlenie otrzymanych danych

6.Usunięcie nazwy węzła (DELETENAME)

 

3)      Transmisja połaczeniowa

a)      Nadawca

1.       Reset węzła (RESET)

2.       Pobranie od użytkownika i dodanie nazwy węzła (ADDNAME)

3.       Nawiązanie logicznego połączenia (sesji) (CALL)

4.       Pobranie i wysyłka danych (SEND)

5.       Zakończenie sesji (HANGUP) – nadawca lub odbiorca, nie obaj

6.       Usunięcie nazwy węzła (DELETENAME)

b)      Odbiorca

1.       Reset węzła (RESET)

2.       Pobranie od użytkownika i dodanie nazwy węzła (ADDNAME)

3.       Nawiązanie logicznego połączenia (sesji) (LISTEN)

4.       Odbiór danych (RECEIVE) i wyświetlenie otrzymanych danych

5.       Zakończenie sesji (HANGUP) – nadawca lub odbiorca, nie obaj

6.       Usunięcie nazwy węzła (DELETENAME)

 

2.       WINSOCK

Opis funkcji:

a)      WSAStartup(version, &wsadata) – służy do inicjalizacji WINSOCK, konieczna na początku każdego programu, jako parametry przyjmuje version – wersje WINSOCK i &wsadata – wskaźnik na strukturę WSAData zawierającej szczegóły implementacji WINSOCK, zwraca 0 jeżeli inicjalizacja się powiedzie lub kod błędu w przeciwnym wypadku

b)      gethostname(nazwa, sizeof(nazwa)) -  pobiera nazwę hosta do zmiennej nazwa (typu string), zwraca 0 jeżeli operacja się powiedzie, w przeciwnym wypadku kod błędu

c)      gethostbyname(nazwa) – informacja zwraca strukturę hostent, zawierającą informacje o hoście o podanej nazwie (np. nazwę, IP etc.)

d)      gethostbyaddr(ipBin, 4, AF_INET) – zwraca strukturę hostent, zawierającą informacje o hoscie o ip podanym w izbin (adres w ipBin uzyskuje się poprzez potraktowanie adresu w formacie a.b.c.d zapisanego w stringu funkcją inet_addr, np. ipBin = inet_addr(nrIp)), 4 oznacza długość adresu ipBin która zawsze jest równa 4 dla AF_INET

e)      socket(AF_INET, typGniazda, rodzajProtokolu) – tworzy gniazdo i zwraca jego numer (będący intem) lub -1 jeżeli operacja się nie powiodła; pierwszy parametr to typ używanych adresów (dla Internetu AF_INET), drugim parametrem jest typ gniazda (SOCK_DGRAM dla transmisji bezpołączeniowej i SOCK_STREAM dla transmisji połączeniowej), trzeci to rodzaj używanego protokołu – IPPROTO_UDP dla transmisji bezpołączeniowej, IPPROTO_TCP dla transmisji połączeniowej (można też wpisać 0, wtedy program sam sobie wybierze (?) i też będzie działać)

f)       sendto(socketNum, wiadomosc, dlugoscWiad, 0, (struct sockaddr *)&socket, &x) -  wysyłanie wiadomości w transmisji bezpołączeniowej, funkcja zwraca ilość wysłanych charów jeżeli wysyłka się powiodła, przyjmuje za parametry numer gniazda otrzymany po wykonaniu funkcji socket(), bufor z wiadomością do wysłania, długość wysyłanej wiadomości, 0 lub flagę mającą wpływ na wysyłanie danych, zmienną typu sockaddr_in zawierającą informacje o odbiorcy (ip, numer portu) rzutowaną na typ sockaddr, wskaźnik na zmienną zawierającą wielkość zmiennej socket

g)      recvfrom(socketNum, wiadomosc, długośćWiad, 0, (struct sockaddr *)&socket, &x) – odbieranie wiadomości w transmisji bezpołączeniowej, za parametry przyjmuje numer socketa zwrócony przez socket(), bufor do którego będzie zapisana otrzymana wiadomosc, długość wiadomości, 0 lub flagi, zmienną do której będzą zapisane informacje o nadawcy, wskaźnik na zmienną zawierająco wielkość zmiennej socket (która jest typu sockaddr_in); dwa ostatnie parametry można ustawić odpowiednio na NULL i 0

h)      bind(socketNum,(struct sockaddr *)&socket,&x) – nazwanie gniazda, tj. przypisanie gniazdu socketNum właściwości ze zmiennej socket, czyli np. określenie na którym porcie będzie wykonywany nasłuch; funkcja najczęściej używana w programie odbiorcy w transmisjach połączeniowych

i)        connect(socketNum, (struct sockaddr *) &socket, &x) – nawiązanie połączenia przez gniazdko socketNum z gniazdem, o którym informacje zawarte są w zmiennej socket

j)        listen(socketNum, 5) – nasłuch prowadzony przez gniazdo socketNum, drugi parametr określa ile połączeń jednocześnie może być obsłużonych (od 1 do 5)

k)      accept( socketNum, (struct sockaddr *) &socket,&x) – nawiązuje połączenie oczekujące w kolejce połączeń gniazda socketNum ustawionego w tryb nasłuchu funkcją listen(), dwa ostatnie parametry służą do identyfikacji nadawcy i są opcjonalne, funkcja tworzy nowe gniazdo i zwraca jego numer (odbiór wiadomości odbywa się na nowym gnieździe)

l)        send(socketNum, wiadomosc, dlugoscWiad, 0) – wysyłka w transmisji połączeniowej

m)    recv(socketNum, wiadomosc, długośćWiad, 0) – odbiór wiadomości w transmisji połączeniowej, tutaj socketNum nie jest numerem gniazda zwróconym przez akcept()

n)      closesocket(socketNum) – zamknięcie gniazda socketNum

o)      WSACleanup() – zwolnienie WinSocka

p)      htons(liczba) – konwertuje liczbę typu u_short (na dobrą sprawę może być int) z host na network byte order

q)      htonl(liczba) – konwertuje liczbę typu u_long (na dobrą sprawę może być int) z host na network byte order

r)       ntohs(liczba) – konwertuje liczbę typu u_short (na dobrą sprawę może być int) z network na host byte order

s)       ntohl(liczba) – konwertuje liczbę typu u_long (na dobrą sprawę może być int) z network na host byte order

t)        inet_addr(string) – konwertuje string zawierający IP w formacie a.b.c.d na typ in_addr która może być użyta w zmiennej typu sockaddr_in

u)      inet_ntoa(in_adrr) – zamienia adres IP w formacie in_addr na stringa zawierającego to IP w formacie a.b.c.d

Struktura sockaddr_in:

              struct sockaddr_in{

                 ...

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • jucek.xlx.pl






  • Formularz

    POst

    Post*

    **Add some explanations if needed