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{
...