Damian Gądziak,
93818,
Grupa lab 1
23 lutego, 15:37
Link do wzorca tego dokumentu:
https://docs.google.com/document/d/16XE-sDB7Z6HBmE8yOnYUjOnGzNFQ2Q8CF1YsBGcF33U/edit
1. Skopij ten dokument i --> udostępnij go do współedycji[Author:(null)] użytkownikowi zwierzak@man.poznan.pl
2. Link do utworzonego dokumentu wklej do formularza:
https://docs.google.com/spreadsheet/viewform?formkey=dGx1b1oyUHVJNG53TWJCVWFaOVlsS2c6MQ#gid=0
--> Spis treści
Ćwiczenie 1
1. Odczytanie adresu IP komputera
2. Wyświetlenie tablicy rutingowej
3. Wyświetlenie tabeli translacji
4. Sprawdzenie dostępności hosta
5. Zapis komunikacji sieciowej
6. Określenie adresu IP wybranego hosta
7. Wyświetlenie statystyki wykorzystania połączeń sieciowych
Ćwiczenie 2
Konfiguracja A - B
Konfiguracja A - B - C (ruter)
Ćwiczenie 3
Konfiguracja A - B - C (NAT)
Ćwiczenie 4
Konfiguracja A - B - C - D (Tunel)
Ćwiczenie 5
Konfiguracja DHCP
Ćwiczenie 6
Ćwiczenie 7
Dodatki: Polecenia
ipconfig
route
arp
ping
tracert
nslookup
netstat
Literatura[Author:(null)]
Ćwiczenie 1
1. Odczytanie adresu IP komputera
(polecenie: ipconfig) i przedstawienie go w systemie binarnym. Odczytaj maskę sieciową i określ adres sieci. Ile urządzeń sieciowych może być podłączonych do tej sieci?
http://www.man.poznan.pl/~zwierzak/sk/kalkulator/kalkulator.html
Otwarcie konsoli tekstowej
cmd
Zapis do pliku
ipconfig > plik.txt
Dopisanie do pliku
ipconfig >> plik.txt
Przekierowanie błędów do pliku
ipconfig 2> plik.txt
Konfiguracja IP systemu Windows
Karta Ethernet Połączenie lokalne:
Sufiks DNS konkretnego połączenia : cie.put.poznan.pl
Adres IP. . . . . . . . . . . . . : 150.254.41.21
10010110 10010110 00101001 00010101
Maska podsieci. . . . . . . . . . : 255.255.255.192
Adres sieci
Brama domyślna. . . . . . . . . . : 150.254.41.1
Max podpięte urządzenia 62
2. Wyświetlenie tablicy rutingowej
(polecenie: route print)
===========================================================================
Lista interfejs˘w
0x1 ........................... MS TCP Loopback interface
0x2 ...00 19 99 50 b5 2a ...... Intel(R) 82567LF-3 Gigabit Network Connection - Sterownik miniport Harmonogramu pakietów
0x3 ...08 00 27 00 bc 07 ...... VirtualBox Host-Only Ethernet Adapter - Sterownik miniport Harmonogramu pakietów
===========================================================================
===========================================================================
Aktywne trasy:
Miejsce docelowe w sieci Maska sieci Brama Interfejs Metryka
0.0.0.0 0.0.0.0 150.254.41.1 150.254.41.21 20
68.232.35.119 255.255.255.255 150.254.41.5 150.254.41.21 1
74.125.79.189 255.255.255.255 150.254.41.5 150.254.41.21 1
80.252.0.145 255.255.255.255 150.254.41.5 150.254.41.21 1
85.17.25.236 255.255.255.255 150.254.41.5 150.254.41.21 1
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
150.254.41.0 255.255.255.192 150.254.41.21 150.254.41.21 20
150.254.41.21 255.255.255.255 127.0.0.1 127.0.0.1 20
150.254.173.3 255.255.255.255 150.254.41.5 150.254.41.21 1
150.254.255.255 255.255.255.255 150.254.41.21 150.254.41.21 20
173.194.70.120 255.255.255.255 150.254.41.5 150.254.41.21 1
192.168.56.0 255.255.255.0 192.168.56.1 192.168.56.1 20
192.168.56.1 255.255.255.255 127.0.0.1 127.0.0.1 20
192.168.56.255 255.255.255.255 192.168.56.1 192.168.56.1 20
209.85.148.113 255.255.255.255 150.254.41.5 150.254.41.21 1
224.0.0.0 240.0.0.0 150.254.41.21 150.254.41.21 20
224.0.0.0 240.0.0.0 192.168.56.1 192.168.56.1 20
255.255.255.255 255.255.255.255 150.254.41.21 150.254.41.21 1
255.255.255.255 255.255.255.255 192.168.56.1 192.168.56.1 1
Domyylna brama: 150.254.41.1.
===========================================================================
Trasy trwaae:
Brak
3. Wyświetlenie tabeli translacji
adresów IP na adresy fizyczne MAC (polecenie: arp -a)
Interfejs: 150.254.41.21 --- 0x2
Adres internetowy Adres fizyczny Typ
150.254.41.1 00-1b-21-4e-39-92 dynamiczne
150.254.41.3 20-fd-f1-98-80-0f dynamiczne
150.254.41.5 00-10-5a-22-b0-83 dynamiczne
4. Sprawdzenie dostępności hosta
(polecenie: ping localhost)
Badanie 127.0.0.1 z uľyciem 32 bajt˘w danych:
Odpowied« z 127.0.0.1: bajt˘w=32 czas<1 ms TTL=128
Odpowied« z 127.0.0.1: bajt˘w=32 czas<1 ms TTL=128
Odpowied« z 127.0.0.1: bajt˘w=32 czas<1 ms TTL=128
Odpowied« z 127.0.0.1: bajt˘w=32 czas<1 ms TTL=128\
Statystyka badania ping dla 127.0.0.1:
Pakiety: Wysane = 4, Odebrane = 4, Utracone = 0 (0% straty),
Szacunkowy czas bĄdzenia pakiet˘w w millisekundach:
Minimum = 0 ms, Maksimum = 0 ms, Czas redni = 0 ms
5. Zapis komunikacji sieciowej
w programie WireShark
No. Time Source Destination Protocol Length Info
1 0.000000 150.254.41.21 150.254.41.1 DHCP 349 DHCP Request - Transaction ID 0xca4fc836
Frame 1: 349 bytes on wire (2792 bits), 349 bytes captured (2792 bits)
Ethernet II, Src: FujitsuT_50:b5:2a (00:19:99:50:b5:2a), Dst: IntelCor_4e:39:92 (00:1b:21:4e:39:92)
Internet Protocol Version 4, Src: 150.254.41.21 (150.254.41.21), Dst: 150.254.41.1 (150.254.41.1)
User Datagram Protocol, Src Port: bootpc (68), Dst Port: bootps (67)
Bootstrap Protocol
No. Time Source Destination Protocol Length Info
2 0.000708 150.254.41.1 150.254.41.21 DHCP 343 DHCP ACK - Transaction ID 0xca4fc836
Frame 2: 343 bytes on wire (2744 bits), 343 bytes captured (2744 bits)
Ethernet II, Src: IntelCor_4e:39:92 (00:1b:21:4e:39:92), Dst: FujitsuT_50:b5:2a (00:19:99:50:b5:2a)
Internet Protocol Version 4, Src: 150.254.41.1 (150.254.41.1), Dst: 150.254.41.21 (150.254.41.21)
User Datagram Protocol, Src Port: bootps (67), Dst Port: bootpc (68)
Bootstrap Protocol
No. Time Source Destination Protocol Length Info
3 3.916706 FujitsuS_cd:f7:14 Broadcast ARP 60 Who has 150.254.41.1? Tell 150.254.41.43
Frame 3: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Ethernet II, Src: FujitsuS_cd:f7:14 (00:30:05:cd:f7:14), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Address Resolution Protocol (request)
No. Time Source Destination Protocol Length Info
4 5.008204 IntelCor_4e:39:92 FujitsuT_50:b5:2a ARP 60 Who has 150.254.41.21? Tell 150.254.41.1
Frame 4: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Ethernet II, Src: IntelCor_4e:39:92 (00:1b:21:4e:39:92), Dst: FujitsuT_50:b5:2a (00:19:99:50:b5:2a)
Address Resolution Protocol (request)
No. Time Source Destination Protocol Length Info
5 5.008215 FujitsuT_50:b5:2a IntelCor_4e:39:92 ARP 42 150.254.41.21 is at 00:19:99:50:b5:2a
Frame 5: 42 bytes on wire (336 bits), 42 bytes captured (336 bits)
Ethernet II, Src: FujitsuT_50:b5:2a (00:19:99:50:b5:2a), Dst: IntelCor_4e:39:92 (00:1b:21:4e:39:92)
Address Resolution Protocol (reply)
No. Time Source Destination Protocol Length Info
6 18.167242 173.194.65.189 150.254.41.21 TLSv1 107 Application Data
Frame 6: 107 bytes on wire (856 bits), 107 bytes captured (856 bits)
Ethernet II, Src: 3com_22:b0:83 (00:10:5a:22:b0:83), Dst: FujitsuT_50:b5:2a (00:19:99:50:b5:2a)
Internet Protocol Version 4, Src: 173.194.65.189 (173.194.65.189), Dst: 150.254.41.21 (150.254.41.21)
Transmission Control Protocol, Src Port: https (443), Dst Port: netmagic (1196), Seq: 1, Ack: 1, Len: 53
Secure Sockets Layer
No. Time Source Destination Protocol Length Info
7 18.343074 150.254.41.21 173.194.65.189 TCP 54 netmagic > https [ACK] Seq=1 Ack=54 Win=64921 Len=0
Frame 7: 54 bytes on wire (432 bits), 54 bytes captured (432 bits)
Ethernet II, Src: FujitsuT_50:b5:2a (00:19:99:50:b5:2a), Dst: 3com_22:b0:83 (00:10:5a:22:b0:83)
Internet Protocol Version 4, Src: 150.254.41.21 (150.254.41.21), Dst: 173.194.65.189 (173.194.65.189)
Transmission Control Protocol, Src Port: netmagic (1196), Dst Port: https (443), Seq: 1, Ack: 54, Len: 0
No. Time Source Destination Protocol Length Info
8 23.175064 3com_22:b0:83 FujitsuT_50:b5:2a ARP 60 Who has 150.254.41.21? Tell 150.254.41.5
Frame 8: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Ethernet II, Src: 3com_22:b0:83 (00:10:5a:22:b0:83), Dst: FujitsuT_50:b5:2a (00:19:99:50:b5:2a)
Address Resolution Protocol (request)
No. Time Source Destination Protocol Length Info
9 23.175072 FujitsuT_50:b5:2a 3com_22:b0:83 ARP 42 150.254.41.21 is at 00:19:99:50:b5:2a
Frame 9: 42 bytes on wire (336 bits), 42 bytes captured (336 bits)
Ethernet II, Src: FujitsuT_50:b5:2a (00:19:99:50:b5:2a), Dst: 3com_22:b0:83 (00:10:5a:22:b0:83)
Address Resolution Protocol (reply)
No. Time Source Destination Protocol Length Info
10 27.365827 FujitsuT_1c:9c:7a Broadcast ARP 60 Who has 150.254.41.1? Tell 150.254.41.36
Frame 10: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Ethernet II, Src: FujitsuT_1c:9c:7a (00:19:99:1c:9c:7a), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Address Resolution Protocol (request)
6. Określenie adresu IP wybranego hosta
(np. www.wp.pl) za pomocą programu nslookup
Nazwa: wp.pl
Address: 212.77.100.101
7. Wyświetlenie statystyki wykorzystania połączeń sieciowych
(polecenie: netstat)
Protok˘ Adres lokalny Obcy adres Stan
TCP PC-50B52A:1026 localhost:1027 USTANOWIONO
TCP PC-50B52A:1027 localhost:1026 USTANOWIONO
TCP PC-50B52A:1054 localhost:1055 USTANOWIONO
TCP PC-50B52A:1055 localhost:1054 USTANOWIONO
TCP PC-50B52A:1056 localhost:1057 USTANOWIONO
TCP PC-50B52A:1057 localhost:1056 USTANOWIONO
TCP PC-50B52A:1258 ee-in-f105.1e100.net:http USTANOWIONO
TCP PC-50B52A:1259 ey-in-f94.1e100.net:http USTANOWIONO
TCP PC-50B52A:1260 ey-in-f132.1e100.net:http USTANOWIONO
TCP PC-50B52A:1261 ey-in-f94.1e100.net:http USTANOWIONO
TCP PC-50B52A:1262 fa-in-f120.1e100.net:http USTANOWIONO
TCP PC-50B52A:1263 ey-in-f94.1e100.net:http USTANOWIONO
TCP PC-50B52A:1264 ey-in-f94.1e100.net:http USTANOWIONO
TCP PC-50B52A:1265 fa-in-f120.1e100.net:http USTANOWIONO
TCP PC-50B52A:1267 fa-in-f139.1e100.net:https USTANOWIONO
TCP PC-50B52A:1269 fa-in-f120.1e100.net:https USTANOWIONO
TCP PC-50B52A:1270 fra07s07-in-f113.1e100.net:https USTANOWIONO
TCP PC-50B52A:1274 fra07s07-in-f155.1e100.net:http USTANOWIONO
TCP PC-50B52A:1280 fra07s07-in-f154.1e100.net:http USTANOWIONO
TCP PC-50B52A:1281 fra07s07-in-f155.1e100.net:http USTANOWIONO
TCP PC-50B52A:1282 fra07s07-in-f155.1e100.net:http USTANOWIONO
TCP PC-50B52A:1284 fra07s07-in-f113.1e100.net:http USTANOWIONO
TCP PC-50B52A:1285 fra07s07-in-f84.1e100.net:https USTANOWIONO
TCP PC-50B52A:1286 fra07s07-in-f154.1e100.net:https USTANOWIONO
TCP PC-50B52A:1288 fra07s07-in-f139.1e100.net:https USTANOWIONO
TCP PC-50B52A:1289 fra07s07-in-f100.1e100.net:https USTANOWIONO
TCP PC-50B52A:1290 fra07s07-in-f100.1e100.net:https USTANOWIONO
TCP PC-50B52A:1308 fa-in-f113.1e100.net:https USTANOWIONO
TCP PC-50B52A:1314 ee-in-f189.1e100.net:https USTANOWIONO
8. Co to jest hub (koncentrator)?
urządzenie koncentryczne przekazujące sygnał do innych komputerów w jedną lub drugą stronę. W architekturze rozgwiazdy
9. Co to jest switch (przełącznik sieciowy) ?
Urządzenie podobne do huba, lecz potrafiące jednocześnie prowadzić ruch sieci w dwie strony
10. Co to jest ruter ?
urządzenie posiadające zazwyczaj w sobie switcha, aczkolwiek głównym elementem routera jest przekazywanie połączenia drogą radiową. Nie posiada w sobie servera ftp, smtp itp ale działa na podobnej zasadzie jak server fizyczny
Ćwiczenie 2
Konfiguracja ustawień sieciowych wirtualnych komputerów
Windows Virtual PC
http://www.microsoft.com/windows/virtual-pc/support/virtual-pc-2007.aspx
Instalacja karty MS Looback:
http://support.microsoft.com/kb/839013/pl
Pobierz obraz systemu: dsl-4.4.10.iso z DSL
Virtual Box
https://www.virtualbox.org/
Wykorzystaj dystrybucję linuxa: http://rescuecd.pld-linux.org/
W przypadku Virtual Box ustawić 1GB pamięci RAM
Wartości zmiennych x i z należą do przedziału 2..50,
A: |
192.168.x.z |
eth0 |
B: |
192.168.x.z+100 |
eth0 |
B: |
192.168.x+100.z+100 |
eth1 |
C: |
192.168.x+100.z+200 |
eth0 |
Konfiguracja A - B
Połączenie dwóch komputerów (A i B) za pomocą wirtualnej karty sieciowej (np. Microsoft loopback)
polecenia: ifconfig, ping, route
Konfiguracja A - B - C (ruter)
Połączenie dwóch komputerów (A i B) za pomocą wirtualnej karty sieciowej (np. Microsoft loopback)
polecenia: ifconfig, ping, route, sysctl (aby ustawić przekazywanie pakietów w B)
Ćwiczenie 3
Program klient/serwer, który przesyła bieżącą godzinę z wykorzystaniem protokołu TCP/IP
Programy uruchomić w środowisku Microsoft Visual Studio 2010.
File → New → Project : Win32 Console Application
1. Przykład: Serwer.cpp
#include "stdafx.h"
#define USL_STATUS 1
#define USL_STOP 2
#define USL_KILL 3
#define PORT 8111
#pragma comment(lib, "Ws2_32.lib")
#include <winsock2.h>
struct sockaddr_in server_sockaddr;
struct sockaddr_in client_sockaddr;
int sock;
/** */
int readsock(int sock, void * BUFOR, int len)
{
return recv(sock,(char *)BUFOR,len,0);
}
/** */
int writesock(int sock, void * BUFOR, int len)
{
return send(sock,(char *)BUFOR,len,0);
}
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsd;
int ds, rc, arg;
int port, r;
unsigned char kod;
if (WSAStartup(MAKEWORD(2,2),&wsd) != 0) {perror("Blad WinSock\n"); exit(1);}
port = PORT; printf("Numer portu :[%d]\n",port);
sock = socket(PF_INET, SOCK_STREAM, 0);
if (sock == -1) { perror("socket"); exit(1);}
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(port);
rc = bind(sock, (struct sockaddr *) & server_sockaddr, sizeof (server_sockaddr));
if (rc == -1) { perror("bind"); exit(1); }
rc = listen(sock, 5); if (rc == -1) { perror("listen"); exit(1); }
for(;;)
{
arg = sizeof (client_sockaddr);
printf("Serwer: Czekam...\n");
ds = accept(sock, (struct sockaddr *) &client_sockaddr, &arg);
if (ds == -1) { perror("accept"); break; }
printf("IP klienta:%s\n",inet_ntoa(client_sockaddr.sin_addr));
printf("Obsluga polecen klienta na porcie %ld\n",ds);
do
{
if (readsock(ds,&kod,1) == 1)
{
printf("Kod polecenia %d\n",kod);
switch (kod)
{
case USL_STATUS:
r = 1;
writesock(ds,&r,4);
break;
case USL_STOP:
kod = 0;
printf("Koniec polaczenia z klientem\n\n");
break;
/*
case USL_KILL:
break;
*/
default:
printf("Nierozpoznane polecenie %d\n",kod);
kod = 0;
}
} else break;
} while (kod != 0);
closesocket(ds);
}
closesocket(sock);
WSACleanup();
return 0;
}
2. Przykład: Klient.cpp
#include "stdafx.h"
#define USL_STATUS 1
#define USL_STOP 2
#define USL_KILL 3
#define PORT 8111
#pragma comment(lib, "Ws2_32.lib")
#include <winsock2.h>
/** */
int readsock(int sock, void * BUFOR, int len)
{
return recv(sock,(char *)BUFOR,len,0);
}
/** */
int writesock(int sock, void * BUFOR, int len)
{
return send(sock,(char *)BUFOR,len,0);
}
struct sockaddr_in client_sockaddr;
int sock;
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsd;
unsigned char kod;
int r;
char * ipchar ="127.0.0.1";
int ip;
if (WSAStartup(MAKEWORD(2,2),&wsd) != 0) {perror("Blad WinSock\n"); exit(1);}
ip = inet_addr(ipchar);
sock = socket(PF_INET, SOCK_STREAM, 0);
if (sock == -1) { perror("socket");exit(1);}
memset(&(client_sockaddr),0,sizeof(struct sockaddr_in));
client_sockaddr.sin_family = AF_INET;
memcpy(&(client_sockaddr.sin_addr),&ip,4);
client_sockaddr.sin_port = htons(PORT);
if (connect(sock,(struct sockaddr *)&(client_sockaddr),sizeof(struct sockaddr_in)) < 0)
{ // brak polaczenia
printf("Brak polaczenia\n");
return 0;
} else
{
printf("Polaczenie OK\n");
kod = USL_STATUS;
writesock(sock,&kod,1); // wybor uslugi 1
readsock(sock,&r,4);
printf("Odpowiedz serwera:%d\n",ntohl(r));
kod = USL_STOP;
writesock(sock,&kod,1); // zakonczenie polaczenia
}
closesocket(sock);
WSACleanup();
system("Pause");
return 0;
}
3. Określ przeznaczenie funkcji
Podaj znaczenie funkcji zaznaczonych na czerwono w kodzie programów serwera.cpp i klienta.cpp
Funkcja/ procedura |
Do czego służy? |
recv() |
funkcja ta odbiera dane z gniazda |
send() |
wysyła dane |
socket() |
inicjuje gniazdo |
bind() |
binduje - czyli przypisuje gniazdo do adresu |
listen() |
nasłuchuje gniazdo |
accept() |
akceptuje połączenie |
inet_ntoa() |
konwertuje adres IP na strukture |
closesocket() |
zamyka gniazdo |
connect() |
nawiązuje połączenie |
inet_addr() |
funkcja odwrotna do inet_ntoa() |
4. Określ schemat komunikacji
Określ przykładowy schemat wymiany danych między klientami a serwerem i przedstaw go graficznie.
5. Usługa zatrzymania działania serwera
Zmodyfikuj kod klienta i serwera dodając nową usługę USL_KILL, która zakończy działanie serwera. Wybór usług w kliencie uzależnić od wyboru użytkownika.
Usługa |
Zmiany w kodzie Serwera |
Zmiany w kodzie Klienta |
USL_KILL |
case USL_KILL: kod = 0; kod2= 0; printf("Head shot\n\n"); break;
|
kod = USL_KILL; writesock(sock,&kod,1); // ZABICIE SERWERA |
6. Usługa zliczająca obsłużonych klientów
Dodaj usługę która zlicza ilu klientów zgłosiło się do serwera i informacja ta zostaje odesłana do klienta.
Usługa |
Zmiany w kodzie Serwera |
Zmiany w kodzie Klienta |
|
int licz = 1; case USL_STATUS: r = htons(licz); writesock(ds,&r,4); break; na koncu fora licz++; |
brak |
7. Usługa przesyłania czasu
Zmodyfikuj kod klienta i serwera dodając usługę USL_TIME, która w odpowiedzi na zapytanie klienta zwróci bieżący czas.
Usługa |
Zmiany w kodzie Serwera |
Zmiany w kodzie Klienta |
USL_TIME |
time_t seconds; seconds = time (NULL); case USL_TIME: r = seconds; writesock(ds,&r,4); break; |
kod = USL_TIME; writesock(sock,&kod,1); readsock(sock,&r,4); printf("Odpowiedz serwera:%d\n",r); |
Ćwiczenie 4
1. Klient/Serwer UDP
Sprawdź działanie programów: Sender i Receiver.
1.1. Przykład: Sender
Dodawanie biblioteki
Project > [nazwa] Properties >
Linker
Input
Additional Dependencies
dopisać bibliotekę ws2_32.lib
Przekazywanie parametrów uruchomieniowych w środowisku VS 2010:
Project > [nazwa] Properties >
Debugging
Command Arguments
wpisać np. -n:50
// Module Name: Sender.c
//
// Description:
// This sample sends UDP datagrams to the specified recipient.
// The -c option first calls connect() to associate the
// recipient's IP address with the socket handle so that the
// send() function can be used as opposed to the sendto() call.
//
// Compile:
// cl -o Sender Sender.c ws2_32.lib
//
// Command line options:
// sender [-p:int] [-r:IP] [-c] [-n:x]
// -p:int Remote port
// -r:IP Recipient's IP address or hostname
// -c Connect to remote IP first
// -n:x Number of times to send message
//
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "ws2_32.lib")
#define DEFAULT_PORT 5150
#define DEFAULT_COUNT 25
BOOL bConnect = FALSE; // Connect to recipient first
int iPort = DEFAULT_PORT; // Port to send data to
int dwCount = DEFAULT_COUNT; // Number of messages to send
char szRecipient[128]; // Recipient's IP or hostname
//
// Function: usage
//
// Description:
// Print usage information and exit
//
void usage()
{
printf("usage: sender [-p:int] [-r:IP] "
"[-c] [-n:x] [-b:x] [-d:c]\n\n");
printf(" -p:int Remote port\n");
printf(" -r:IP Recipients IP address or hostname\n");
printf(" -c Connect to remote IP first\n");
printf(" -n:x Number of times to send message\n");
ExitProcess(1);
}
//
// Function: ValidateArgs
//
// Description:
// Parse the command line arguments, and set some global flags to
// indicate what actions to perform
//
void ValidateArgs(int argc, char **argv)
{
int i;
strcpy(szRecipient, "127.0.0.1");
for(i = 1; i < argc; i++)
{
if ((argv[i][0] == '-') || (argv[i][0] == '/'))
{
switch (tolower(argv[i][1]))
{
case 'p': // Remote port
if (strlen(argv[i]) > 3) iPort = atoi(&argv[i][3]);
break;
case 'r': // Recipient's IP addr
if (strlen(argv[i]) > 3) strcpy(szRecipient, &argv[i][3]);
break;
case 'c': // Connect to recipients IP addr
bConnect = TRUE;
break;
case 'n': // Number of times to send message
if (strlen(argv[i]) > 3) dwCount = atol(&argv[i][3]);
break;
default:
usage();
break;
}
}
}
}
//
// Function: main
//
// Description:
// Main thread of execution. Initialize Winsock, parse the command
// line arguments, create a socket, connect to the remote IP
// address if specified, and then send datagram messages to the
// recipient.
//
int main(int argc, char **argv)
{
WSADATA wsd;
SOCKET s;
int ret,i;
SOCKADDR_IN recipient;
// Parse the command line and load Winsock
//
ValidateArgs(argc, argv);
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
// Create the socket
//
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("socket() failed; %d\n", WSAGetLastError());
return 1;
}
// Resolve the recipient's IP address or hostname
//
recipient.sin_family = AF_INET;
recipient.sin_port = htons((short)iPort);
if ((recipient.sin_addr.s_addr = inet_addr(szRecipient))== INADDR_NONE)
{
struct hostent *host=NULL;
host = gethostbyname(szRecipient);
if (host)
CopyMemory(&recipient.sin_addr, host->h_addr_list[0],host->h_length);
else
{
printf("gethostbyname() failed: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
}
//
// If the connect option is set, "connect" to the recipient
// and send the data with the send() function
//
if (bConnect)
{
if (connect(s, (SOCKADDR *)&recipient, sizeof(recipient)) == SOCKET_ERROR)
{
printf("connect() failed: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
for(i = 0; i < dwCount; i++)
{
ret = send(s, (char *)&i, sizeof(i), 0);
if (ret == SOCKET_ERROR)
{
printf("send() failed: %d\n", WSAGetLastError());
break;
}
else if (ret == 0) break;
// send() succeeded!
}
}
else
{
// Otherwise, use the sendto() function
for(i = 0; i < dwCount; i++)
{
ret = sendto(s, (char *)&i, sizeof(i), 0, (SOCKADDR *)&recipient, sizeof(recipient));
if (ret == SOCKET_ERROR)
{
printf("sendto() failed; %d\n", WSAGetLastError());
break;
}
else if (ret == 0) break;
// sendto() succeeded!
}
}
closesocket(s);
WSACleanup();
return 0;
}
1.2. Przykład: Receiver
// Module Name: Receiver.c
//
// Description:
// This sample receives UDP datagrams by binding to the specified
// interface and port number and then blocking on a recvfrom()
// call
//
// Compile:
// cl -o Receiver Receiver.c ws2_32.lib
//
// Command line options:
// sender [-p:int] [-i:IP][-n:x]
// -p:int Local port
// -i:IP Local IP address to listen on
// -n:x Number of times to send message
//
//
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "ws2_32.lib")
#define DEFAULT_PORT 5150
#define DEFAULT_COUNT 50
int iPort = DEFAULT_PORT; // Port to receive on
int dwCount = DEFAULT_COUNT; // Number of messages to read
BOOL bInterface = FALSE; // Use an interface other than default
char szInterface[32]; // Interface to read datagrams from
//
// Function: usage:
//
// Description:
// Print usage information and exit
//
void usage()
{
printf("usage: sender [-p:int] [-i:IP][-n:x]\n\n");
printf(" -p:int Local port\n");
printf(" -i:IP Local IP address to listen on\n");
printf(" -n:x Number of times to send message\n");
ExitProcess(1);
}
//
// Function: ValidateArgs
//
// Description:
// Parse the command line arguments, and set some global flags to
// indicate what actions to perform
//
void ValidateArgs(int argc, char **argv)
{
int i;
for(i = 1; i < argc; i++)
{
if ((argv[i][0] == '-') || (argv[i][0] == '/'))
{
switch (tolower(argv[i][1]))
{
case 'p': // Local port
if (strlen(argv[i]) > 3)
iPort = atoi(&argv[i][3]);
break;
case 'n': // Number of times to receive message
if (strlen(argv[i]) > 3)
dwCount = atol(&argv[i][3]);
break;
case 'i': // Interface to receive datagrams on
if (strlen(argv[i]) > 3)
{
bInterface = TRUE;
strcpy(szInterface, &argv[i][3]);
}
break;
default:
usage();
break;
}
}
}
}
//
// Function: main
//
// Description:
// Main thread of execution. Initialize Winsock, parse the command
// line arguments, create a socket, bind it to a local interface
// and port, and then read datagrams.
//
int main(int argc, char **argv)
{
WSADATA wsd;
SOCKET s;
int ret,
i, r;
DWORD dwSenderSize;
SOCKADDR_IN sender,local;
// Parse arguments and load Winsock
//
ValidateArgs(argc, argv);
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
// Create the socket and bind it to a local interface and port
//
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("socket() failed; %d\n", WSAGetLastError());
return 1;
}
local.sin_family = AF_INET;
local.sin_port = htons((short)iPort);
if (bInterface) local.sin_addr.s_addr = inet_addr(szInterface);
else local.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(s, (SOCKADDR *)&local, sizeof(local)) == SOCKET_ERROR)
{
printf("bind() failed: %d\n", WSAGetLastError());
return 1;
}
// Read the datagrams
//
for(i = 0; i < dwCount; i++)
{
dwSenderSize = sizeof(sender);
ret = recvfrom(s, (char *)&r, sizeof(r), 0, (SOCKADDR *)&sender, (int *)&dwSenderSize);
if (ret == SOCKET_ERROR)
{
printf("recvfrom() failed; %d\n", WSAGetLastError());
break;
}
else if (ret == 0) break;
else
{
printf("[%s] sent me: '%d'\n", inet_ntoa(sender.sin_addr), r);
}
}
closesocket(s);
WSACleanup();
return 0;
}
2. Określ przeznaczenie funkcji
Podaj znaczenie funkcji zaznaczonych na czerwono w kodzie programów: Receiver.c
i Sender.c
Funkcja/ procedura |
Do czego służy? |
socket |
Funkcja socket tworzy gniazdo, które jest związane z konkretnym dostawcą usług transportowych. |
WSAStartup |
Funkcja WSAStartup inicjuje użycie DLL Winsock przez proces. |
htons |
funkcja htons() przekształca wartość short integer hostshort z |
inet_addr |
|
connect |
wykonywana przez klienta do nawiazania polaczenia z serwerem. |
sendto |
Funkcja sendto wysyła dane do określonego przeznaczenia. |
WSACleanup |
Funkcja WSACleanup kończy korzystanie z biblioteki DLL Winsock 2 ust Ws2_32.dll). |
htons |
funkcja htons() przekształca wartość short integer hostshort z |
htonl |
konwersja wartości pomiędzy hostem a sieciowej kolejności bajtów /
funkcja htonl() przekształca wartość long integer hostlong z lokalnego |
recvfrom |
Funkcja recvfrom odbiera datagram i zapisuje adresu źródłowego. |
Pakiet zgubione w połączeniu.
Dzięki skonfigurowaniu programu, połączyłem dwa komputery z sali 111 i mogłem sprawdzić ile pakietów z 10000 zostanie zgubionych.
3. Określ schemat komunikacji
(Schemat podobny jak w ćwiczeniu 3)
4. Przesłanie ciągu liczb
Zmodyfikuj program Sender i Receiver tak, aby do serwera wysyłany był (w osobnych pakietach) ciąg kolejnych liczb z przedziału [1..1000].
Sender → [1000] → ... → [2] → [1] → Receiver
Odbiorca zna treść komunikatów jakie powinien otrzymać od nadawcy więc możliwe jest wykrycie anomalii:
zagubienie pakietu (liczba nie została odebrana),
zaburzona kolejność odbierania pakietów (liczba większa została odebrana wcześniej niż liczba mniejsza) ,
zwielokrotnienie otrzymanych pakietów (liczba została odebrana wielokrotnie).
Do realizacji tego zadania można wykorzystać tablicę, która zlicza ile razy wystąpiła dana liczba w komunikatach.
Można również zmienić typ komunikatu - zamiast łańcucha tekstowego przesyłać liczbę typu int.
Zmiany w kodzie Sender |
Zmiany w kodzie Receiver |
case USL_KILL: kod = 0; kod2= 0; printf("Head shot\n\n"); break;
(..) POD KONIEC FOR'A if (kod2 == 0) { break; } |
kod = USL_TIME; writesock(sock,&kod,1); readsock(sock,&r,4); printf("Odpowiedz serwera:%d\n",r); |
5. Porównanie czasu wysyłania komunikatów
Porównaj czas wysyłania 1000 liczb za pomocą protokołu TCP/IP i UDP/IP
W przypadku protokołu UDP (ponieważ istnieje możliwość utraty pakietów) - czas liczymy od pojawienia się pierwszego pakietu, a kończymy pomiar czasu w przypadku wykrycia liczby równej lub większej od 1000.
Ćwiczenie 5
1. Konfiguracja IPv6 w Windows XP
1. Wybierz opcję: Start -> Ustawienia -> Połączenia sieciowe
2. Wybierz połączenie sieciowe związane z fizyczną kartą sieciową (Plik ->Właściwości)
3. Jeżeli na liście w zakładce "Ogólne" jest nie jest dostępny protokół: Microsoft TCP/IP wersja 6, to zainstaluj ten protokół
4. Testowanie protokołu IPv6:
Wybierz: Start -> Uruchom
wpisz komendę : cmd
następnie w oknie terminalna wpisz komendę: ipconfig
odszukaj adres IPv6 komputera
dla danego adresu IPv6 wykonaj polecenie: ping6
zapoznaj się z poleceniem: ipv6
5. Po zakończeniu testów odinstaluj protokół IPv6
ipv6 uninstall
Wykonaj polecenie:
ping6 ::1
Wykonaj ping6 dla adresu lokalnego
Wykonaj ping6 do “sąsiada”
2.2. Czy istnieje związek między adresem IPv6 i numerem MAC karty sieciowej?
Tak.
2.3. Co to jest adres unicast?
Adres emisji pojedynczej (adres określający pojedyncze urządzenie sieci);
Adres unicast - identyfikuje pojedynczy interfejs, pakiety są dostarczane tylko do odbiorcy.
2.4. Co to jest adres multicast?
Adres multicast - identyfikuje grupę interfejsów, pakiety są dostarczane do wszystkich członków grupy.
2.5. Co to jest adres anycast?
Adres anycast - identyfikuje grupę interfejsów, pakiety są dostarczane tylko do najbliższego odbiorcy.
4. Klient w wersji IPv6
// client.c - Simple TCP/UDP client using Winsock 2.2
//
// This is a part of the Microsoft<entity type="reg"/> Source Code Samples.
// Copyright 1996 - 2000 Microsoft Corporation.
// All rights reserved.
// This source code is only intended as a supplement to
// Microsoft Development Tools and/or WinHelp<entity type="reg"/> documentation.
// See these sources for detailed information regarding the
// Microsoft samples programs.
//
#define WIN32_LEAN_AND_MEAN
#include "stdafx.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
//#include <string.h>
// Needed for the Windows 2000 IPv6 Tech Preview.
#if (_WIN32_WINNT == 0x0500)
#include <tpipv6.h>
#endif
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
#define STRICMP _stricmp
//
// This code assumes that at the transport level, the system only supports
// one stream protocol (TCP) and one datagram protocol (UDP). Therefore,
// specifying a socket type of SOCK_STREAM is equivalent to specifying TCP
// and specifying a socket type of SOCK_DGRAM is equivalent to specifying UDP.
//
#define DEFAULT_SERVER NULL // Will use the loopback interface
#define DEFAULT_FAMILY PF_UNSPEC // Accept either IPv4 or IPv6
#define DEFAULT_SOCKTYPE SOCK_STREAM // TCP
#define DEFAULT_PORT "5001" // Arbitrary, albiet a historical test port
#define DEFAULT_EXTRA 0 // Number of "extra" bytes to send
#define BUFFER_SIZE 65536
#define UNKNOWN_NAME "<unknown>"
void Usage(char *ProgName)
{
fprintf(stderr, "\nSimple socket sample client program.\n");
fprintf(stderr,
"\n%s [-s server] [-f family] [-t transport] [-p port] [-b bytes] [-n number]\n\n",ProgName);
fprintf(stderr, " server\tServer name or IP address. (default: %s)\n",
(DEFAULT_SERVER == NULL) ? "loopback address" : DEFAULT_SERVER);
fprintf(stderr,
" family\tOne of PF_INET, PF_INET6 or PF_UNSPEC. (default: %s)\n",
(DEFAULT_FAMILY ==
PF_UNSPEC) ? "PF_UNSPEC" : ((DEFAULT_FAMILY ==
PF_INET) ? "PF_INET" : "PF_INET6"));
fprintf(stderr, " transport\tEither TCP or UDP. (default: %s)\n",
(DEFAULT_SOCKTYPE == SOCK_STREAM) ? "TCP" : "UDP");
fprintf(stderr, " port\t\tPort on which to connect. (default: %s)\n",
DEFAULT_PORT);
fprintf(stderr, " bytes\t\tBytes of extra data to send. (default: %d)\n",
DEFAULT_EXTRA);
fprintf(stderr, " number\tNumber of sends to perform. (default: 1)\n");
fprintf(stderr, " (-n by itself makes client run in an infinite loop,");
fprintf(stderr, " Hit Ctrl-C to terminate)\n");
WSACleanup();
exit(1);
}
LPTSTR PrintError(int ErrorCode)
{
static TCHAR Message[1024];
// If this program was multithreaded, we'd want to use
// FORMAT_MESSAGE_ALLOCATE_BUFFER instead of a static buffer here.
// (And of course, free the buffer when we were done with it)
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_MAX_WIDTH_MASK,
NULL, ErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
Message, 1024, NULL);
return Message;
}
int ReceiveAndPrint(SOCKET ConnSocket, char *Buffer, int BufLen)
{
int AmountRead;
AmountRead = recv(ConnSocket, Buffer, BufLen, 0);
if (AmountRead == SOCKET_ERROR) {
fprintf(stderr, "recv() failed with error %d: %s\n",
WSAGetLastError(), PrintError(WSAGetLastError()));
closesocket(ConnSocket);
WSACleanup();
exit(1);
}
//
// We are not likely to see this with UDP, since there is no
// 'connection' established.
if (AmountRead == 0) {
printf("Server closed connection\n");
closesocket(ConnSocket);
WSACleanup();
exit(0);
}
printf("Received %d bytes from server: [%.*s]\n",
AmountRead, AmountRead, Buffer);
return AmountRead;
}
int main(int argc, char **argv)
{
char Buffer[BUFFER_SIZE], AddrName[NI_MAXHOST];
char *Server = DEFAULT_SERVER;
int Family = DEFAULT_FAMILY;
int SocketType = DEFAULT_SOCKTYPE;
char *Port = DEFAULT_PORT;
WSADATA wsaData;
int i, RetVal, AddrLen, AmountToSend;
int ExtraBytes = DEFAULT_EXTRA;
unsigned int Iteration, MaxIterations = 1;
BOOL RunForever = FALSE;
ADDRINFO Hints, *AddrInfo, *AI;
SOCKET ConnSocket = INVALID_SOCKET;
struct sockaddr_storage Addr;
if (argc > 1) {
for (i = 1; i < argc; i++) {
if (((argv[i][0] == '-') || (argv[i][0] == '/')) &&
(argv[i][1] != 0) && (argv[i][2] == 0)) {
switch (tolower(argv[i][1])) {
case 'f':
if (!argv[i + 1]) Usage(argv[0]);
if (!STRICMP(argv[i + 1], "PF_INET"))
Family = PF_INET;
else if (!STRICMP(argv[i + 1], "AF_INET"))
Family = PF_INET;
else if (!STRICMP(argv[i + 1], "PF_INET6"))
Family = PF_INET6;
else if (!STRICMP(argv[i + 1], "AF_INET6"))
Family = PF_INET6;
else if (!STRICMP(argv[i + 1], "PF_UNSPEC"))
Family = PF_UNSPEC;
else if (!STRICMP(argv[i + 1], "AF_UNSPEC"))
Family = PF_UNSPEC;
else
Usage(argv[0]);
i++;
break;
case 't':
if (!argv[i + 1])
Usage(argv[0]);
if (!STRICMP(argv[i + 1], "TCP"))
SocketType = SOCK_STREAM;
else if (!STRICMP(argv[i + 1], "UDP"))
SocketType = SOCK_DGRAM;
else
Usage(argv[0]);
i++;
break;
case 's':
if (argv[i + 1]) {
if (argv[i + 1][0] != '-') {
Server = argv[++i];
break;
}
}
Usage(argv[0]); break;
case 'p':
if (argv[i + 1]) {
if (argv[i + 1][0] != '-') {
Port = argv[++i];
break;
}
}
Usage(argv[0]); break;
case 'b':
if (argv[i + 1]) {
if (argv[i + 1][0] != '-') {
ExtraBytes = atoi(argv[++i]);
if (ExtraBytes >
sizeof (Buffer) -
sizeof ("Message #4294967295"))
Usage(argv[0]);
break;
}
}
Usage(argv[0]); break;
case 'n':
if (argv[i + 1]) {
if (argv[i + 1][0] != '-') {
MaxIterations = atoi(argv[++i]);
break;
}
}
RunForever = TRUE;
break;
default:
Usage(argv[0]); break;
}
} else Usage(argv[0]);
}
}
// Ask for Winsock version 2.2.
if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0) {
fprintf(stderr, "WSAStartup failed with error %d: %s\n",
RetVal, PrintError(RetVal));
WSACleanup();
return -1;
}
//
// By not setting the AI_PASSIVE flag in the hints to getaddrinfo, we're
// indicating that we intend to use the resulting address(es) to connect
// to a service. This means that when the Server parameter is NULL,
// getaddrinfo will return one entry per allowed protocol family
// containing the loopback address for that family.
memset(&Hints, 0, sizeof (Hints));
Hints.ai_family = Family;
Hints.ai_socktype = SocketType;
RetVal = getaddrinfo(Server, Port, &Hints, &AddrInfo);
if (RetVal != 0) {
fprintf(stderr,
"Cannot resolve address [%s] and port [%s], error %d: %s\n",
Server, Port, RetVal, gai_strerror(RetVal));
WSACleanup();
return -1;
}
//
// Try each address getaddrinfo returned, until we find one to which
// we can successfully connect.
for (AI = AddrInfo; AI != NULL; AI = AI->ai_next) {
// Open a socket with the correct address family for this address.
ConnSocket = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol);
//**** DEBUG
printf("socket call with family: %d socktype: %d, protocol: %d\n",
AI->ai_family, AI->ai_socktype, AI->ai_protocol);
if (ConnSocket == INVALID_SOCKET)
printf("socket call failed with %d\n", WSAGetLastError());
//**** DEBUG END
if (ConnSocket == INVALID_SOCKET) {
fprintf(stderr, "Error Opening socket, error %d: %s\n",
WSAGetLastError(), PrintError(WSAGetLastError()));
continue;
}
// Notice that nothing in this code is specific to whether we
// are using UDP or TCP.
// When connect() is called on a datagram socket, it does not
// actually establish the connection as a stream (TCP) socket
// would. Instead, TCP/IP establishes the remote half of the
// (LocalIPAddress, LocalPort, RemoteIP, RemotePort) mapping.
// This enables us to use send() and recv() on datagram sockets,
// instead of recvfrom() and sendto().
printf("Attempting to connect to: %s\n", Server ? Server : "localhost");
if (connect(ConnSocket, AI->ai_addr, (int) AI->ai_addrlen) != SOCKET_ERROR)
break;
i = WSAGetLastError();
if (getnameinfo(AI->ai_addr, (int) AI->ai_addrlen, AddrName,
sizeof (AddrName), NULL, 0, NI_NUMERICHOST) != 0)
strcpy_s(AddrName, sizeof (AddrName), UNKNOWN_NAME);
fprintf(stderr, "connect() to %s failed with error %d: %s\n",
AddrName, i, PrintError(i));
closesocket(ConnSocket);
}
if (AI == NULL) {
fprintf(stderr, "Fatal error: unable to connect to the server.\n");
WSACleanup();
return -1;
}
//
// This demonstrates how to determine to where a socket is connected.
AddrLen = sizeof (Addr);
if (getpeername(ConnSocket, (LPSOCKADDR) & Addr, (int *) &AddrLen) == SOCKET_ERROR) {
fprintf(stderr, "getpeername() failed with error %d: %s\n",
WSAGetLastError(), PrintError(WSAGetLastError()));
} else {
if (getnameinfo((LPSOCKADDR) & Addr, AddrLen, AddrName,
sizeof (AddrName), NULL, 0, NI_NUMERICHOST) != 0)
strcpy_s(AddrName, sizeof (AddrName), UNKNOWN_NAME);
printf("Connected to %s, port %d, protocol %s, protocol family %s\n",
AddrName, ntohs(SS_PORT(&Addr)),
(AI->ai_socktype == SOCK_STREAM) ? "TCP" : "UDP",
(AI->ai_family == PF_INET) ? "PF_INET" : "PF_INET6");
}
// We are done with the address info chain, so we can free it.
freeaddrinfo(AddrInfo);
//
// Find out what local address and port the system picked for us.
AddrLen = sizeof (Addr);
if (getsockname(ConnSocket, (LPSOCKADDR) & Addr, &AddrLen) == SOCKET_ERROR) {
fprintf(stderr, "getsockname() failed with error %d: %s\n",
WSAGetLastError(), PrintError(WSAGetLastError()));
} else {
if (getnameinfo((LPSOCKADDR) & Addr, AddrLen, AddrName,
sizeof (AddrName), NULL, 0, NI_NUMERICHOST) != 0)
strcpy_s(AddrName, sizeof (AddrName), UNKNOWN_NAME);
printf("Using local address %s, port %d\n",
AddrName, ntohs(SS_PORT(&Addr)));
}
// Send and receive in a loop for the requested number of iterations.
for (Iteration = 0; RunForever || Iteration < MaxIterations; Iteration++) {
// Compose a message to send.
AmountToSend =
sprintf_s(Buffer, sizeof (Buffer), "Message #%u", Iteration + 1);
for (i = 0; i < ExtraBytes; i++) {
Buffer[AmountToSend++] = (char) ((i & 0x3f) + 0x20);
}
// Send the message. Since we are using a blocking socket, this
// call shouldn't return until it's able to send the entire amount.
RetVal = send(ConnSocket, Buffer, AmountToSend, 0);
if (RetVal == SOCKET_ERROR) {
fprintf(stderr, "send() failed with error %d: %s\n",
WSAGetLastError(), PrintError(WSAGetLastError()));
WSACleanup();
return -1;
}
printf("Sent %d bytes (out of %d bytes) of data: [%.*s]\n",
RetVal, AmountToSend, AmountToSend, Buffer);
// Clear buffer just to prove we're really receiving something.
memset(Buffer, 0, sizeof (Buffer));
// Receive and print server's reply.
ReceiveAndPrint(ConnSocket, Buffer, sizeof (Buffer));
}
// Tell system we're done sending.
printf("Done sending\n");
shutdown(ConnSocket, SD_SEND);
//
// Since TCP does not preserve message boundaries, there may still
// be more data arriving from the server. So we continue to receive
// data until the server closes the connection.
if (SocketType == SOCK_STREAM)
while (ReceiveAndPrint(ConnSocket, Buffer, sizeof (Buffer)) != 0) ;
closesocket(ConnSocket);
WSACleanup();
return 0;
}
Screan z połączenia Klient - Serwer
5. Określ przeznaczenie funkcji
Podaj znaczenie funkcji zaznaczonych na czerwono w kodzie programów: Serwer i Klient w wersji IPv6
Funkcja/ procedura |
Do czego służy? |
getnameinfo |
Getnameinfo - tłumaczenie adresu na nazwę w sposób niezależny od protokołu. |
PF_INET6 |
Rodzina Protokół IP w wersji 6 |
getnameinfo |
Getnameinfo funkcja zapewnia niezależny od protokołu rozwiązywania nazw z adresu do ANSI nazwę hosta oraz numer portu do ANSI nazwy usługi. |
PF_INET6 |
Rodzina Protokół IP w wersji 6 |
getaddrinfo |
Getaddrinfo - tłumaczenie adresów i usług sieciowych.
|
getnameinfo |
Funkcja getnameinfo - uzyskuje informacje o nazwie |
getpeername |
Funkcja getpeername pobiera adres peera, do którego gniazdo jest podłączone. |
freeaddrinfo |
Freeaddrinfo funkcja uwalnia dane adresowe. |
6. Zapis komunikacji
Za pomocą programu Wireshark prześledź komunikację między klientem i serwerem wykorzystującym protokół IPv6.
Wykorzystaj filtr: ipv6
Plik tekstowy z połączenia Klient - Serwer (pochodzi z Wireshark )
No. Time Source Destination Protocol Length Info
1 0.000000 3com_22:b0:83 Broadcast ARP 60 Who has 150.254.41.24? Tell 150.254.41.5
Frame 1: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Ethernet II, Src: 3com_22:b0:83 (00:10:5a:22:b0:83), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Address Resolution Protocol (request)
No. Time Source Destination Protocol Length Info
2 0.699916 3com_22:b0:83 Broadcast ARP 60 Who has 150.254.41.23? Tell 150.254.41.5
Frame 2: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Ethernet II, Src: 3com_22:b0:83 (00:10:5a:22:b0:83), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Address Resolution Protocol (request)
No. Time Source Destination Protocol Length Info
3 0.999956 3com_22:b0:83 Broadcast ARP 60 Who has 150.254.41.24? Tell 150.254.41.5
Frame 3: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Ethernet II, Src: 3com_22:b0:83 (00:10:5a:22:b0:83), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Address Resolution Protocol (request)
No. Time Source Destination Protocol Length Info
4 2.000015 3com_22:b0:83 Broadcast ARP 60 Who has 150.254.41.24? Tell 150.254.41.5
Frame 4: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Ethernet II, Src: 3com_22:b0:83 (00:10:5a:22:b0:83), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Address Resolution Protocol (request)
No. Time Source Destination Protocol Length Info
5 3.170190 173.194.65.189 150.254.41.21 TLSv1 134 Application Data, Application Data
Frame 5: 134 bytes on wire (1072 bits), 134 bytes captured (1072 bits)
Ethernet II, Src: 3com_22:b0:83 (00:10:5a:22:b0:83), Dst: FujitsuT_50:b5:2a (00:19:99:50:b5:2a)
Internet Protocol Version 4, Src: 173.194.65.189 (173.194.65.189), Dst: 150.254.41.21 (150.254.41.21)
Transmission Control Protocol, Src Port: https (443), Dst Port: amt-esd-prot (1082), Seq: 1, Ack: 1, Len: 80
Secure Sockets Layer
No. Time Source Destination Protocol Length Info
6 3.303535 150.254.41.21 173.194.65.189 TCP 54 amt-esd-prot > https [ACK] Seq=1 Ack=81 Win=32431 Len=0
Frame 6: 54 bytes on wire (432 bits), 54 bytes captured (432 bits)
Ethernet II, Src: FujitsuT_50:b5:2a (00:19:99:50:b5:2a), Dst: IntelCor_4e:39:92 (00:1b:21:4e:39:92)
Internet Protocol Version 4, Src: 150.254.41.21 (150.254.41.21), Dst: 173.194.65.189 (173.194.65.189)
Transmission Control Protocol, Src Port: amt-esd-prot (1082), Dst Port: https (443), Seq: 1, Ack: 81, Len: 0
No. Time Source Destination Protocol Length Info
7 3.745776 IntelCor_4e:39:92 Broadcast ARP 60 Who has 150.254.41.19? Tell 150.254.41.1
Frame 7: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Ethernet II, Src: IntelCor_4e:39:92 (00:1b:21:4e:39:92), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Address Resolution Protocol (request)
No. Time Source Destination Protocol Length Info
8 4.746082 IntelCor_4e:39:92 Broadcast ARP 60 Who has 150.254.41.19? Tell 150.254.41.1
Frame 8: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Ethernet II, Src: IntelCor_4e:39:92 (00:1b:21:4e:39:92), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Address Resolution Protocol (request)
No. Time Source Destination Protocol Length Info
9 5.746153 IntelCor_4e:39:92 Broadcast ARP 60 Who has 150.254.41.19? Tell 150.254.41.1
Frame 9: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Ethernet II, Src: IntelCor_4e:39:92 (00:1b:21:4e:39:92), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Address Resolution Protocol (request)
No. Time Source Destination Protocol Length Info
10 8.180257 173.194.65.189 150.254.41.21 TLSv1 135 Application Data, Application Data
Frame 10: 135 bytes on wire (1080 bits), 135 bytes captured (1080 bits)
Ethernet II, Src: 3com_22:b0:83 (00:10:5a:22:b0:83), Dst: FujitsuT_50:b5:2a (00:19:99:50:b5:2a)
Internet Protocol Version 4, Src: 173.194.65.189 (173.194.65.189), Dst: 150.254.41.21 (150.254.41.21)
Transmission Control Protocol, Src Port: https (443), Dst Port: amt-esd-prot (1082), Seq: 81, Ack: 1, Len: 81
Secure Sockets Layer
No. Time Source Destination Protocol Length Info
11 8.333943 150.254.41.21 173.194.65.189 TCP 54 amt-esd-prot > https [ACK] Seq=1 Ack=162 Win=32391 Len=0
Frame 11: 54 bytes on wire (432 bits), 54 bytes captured (432 bits)
Ethernet II, Src: FujitsuT_50:b5:2a (00:19:99:50:b5:2a), Dst: IntelCor_4e:39:92 (00:1b:21:4e:39:92)
Internet Protocol Version 4, Src: 150.254.41.21 (150.254.41.21), Dst: 173.194.65.189 (173.194.65.189)
Transmission Control Protocol, Src Port: amt-esd-prot (1082), Dst Port: https (443), Seq: 1, Ack: 162, Len: 0
No. Time Source Destination Protocol Length Info
12 9.167383 150.254.41.21 173.194.65.189 TCP 1484 [TCP segment of a reassembled PDU]
Frame 12: 1484 bytes on wire (11872 bits), 1484 bytes captured (11872 bits)
Ethernet II, Src: FujitsuT_50:b5:2a (00:19:99:50:b5:2a), Dst: IntelCor_4e:39:92 (00:1b:21:4e:39:92)
Internet Protocol Version 4, Src: 150.254.41.21 (150.254.41.21), Dst: 173.194.65.189 (173.194.65.189)
Transmission Control Protocol, Src Port: amt-esd-prot (1082), Dst Port: https (443), Seq: 1, Ack: 162, Len: 1430
No. Time Source Destination Protocol Length Info
13 9.167403 150.254.41.21 173.194.65.189 TLSv1 687 Application Data
Frame 13: 687 bytes on wire (5496 bits), 687 bytes captured (5496 bits)
Ethernet II, Src: FujitsuT_50:b5:2a (00:19:99:50:b5:2a), Dst: IntelCor_4e:39:92 (00:1b:21:4e:39:92)
Internet Protocol Version 4, Src: 150.254.41.21 (150.254.41.21), Dst: 173.194.65.189 (173.194.65.189)
Transmission Control Protocol, Src Port: amt-esd-prot (1082), Dst Port: https (443), Seq: 1431, Ack: 162, Len: 633
[2 Reassembled TCP Segments (2063 bytes): #12(1430), #13(633)]
Secure Sockets Layer
No. Time Source Destination Protocol Length Info
14 9.201500 173.194.65.189 150.254.41.21 TCP 60 https > amt-esd-prot [ACK] Seq=162 Ack=2064 Win=1312 Len=0
Frame 14: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Ethernet II, Src: 3com_22:b0:83 (00:10:5a:22:b0:83), Dst: FujitsuT_50:b5:2a (00:19:99:50:b5:2a)
Internet Protocol Version 4, Src: 173.194.65.189 (173.194.65.189), Dst: 150.254.41.21 (150.254.41.21)
Transmission Control Protocol, Src Port: https (443), Dst Port: amt-esd-prot (1082), Seq: 162, Ack: 2064, Len: 0
Ćwiczenie 6
Sieci WiFi, Aplikacje sieciowe na urządzenia mobilne
Ćwiczenie 7
Symulator sieciowy ns-2
Dodatki: Polecenia
ipconfig
SPOSÓB UŻYCIA:
ipconfig [/? | /all | /renew [karta] | /release [karta] |
/flushdns | /displaydns | /registerdns |
/showclassid karta |
/setclassid karta [identyfikator_klasy] ]
gdzie
karta Nazwa połączenia
(dozwolone symbole zastępcze * i ?, zobacz przykłady)
Opcje:
/? Wyświetla ten komunikat pomocy.
/all Wyświetla pełne informacje o konfiguracji.
/release Zwalnia adres IP dla określonej karty.
/renew Odnawia adres IP dla określonej karty.
/flushdns Czyści bufor programu rozpoznającego nazwy DNS.
/registerdns Odświeża wszystkie dzierżawy DHCP i ponownie rejestruje nazwy DNS.
/displaydns Wyświetla zawartość buforu programu rozpoznającego nazwy DNS.
/showclassid Wyświetla wszystkie identyfikatory klas DHCP dozwolone dla karty.
/setclassid Modyfikuje identyfikator klasy DHCP.
Zachowanie domyślne to wyświetlanie tylko adresu IP, maski podsieci i bramy domyślnej dla każdej karty związanej z protokołem TCP/IP.
Jeśli dla przełączników Release i Renew nie zostanie określona nazwa karty,
zwolnieniu lub odnowieniu ulegają dzierżawy adresów IP dla wszystkich kart
związanych z protokołem TCP/IP.
Jeśli dla przełącznika Setclassid nie zostanie określony parametr identyfikator_klasy, to identyfikator_klasy jest usuwany.
Przykłady:
> ipconfig ... Pokazuje informacje.
> ipconfig /all ... Pokazuje informacje szczegółowe.
> ipconfig /renew ... Odnawia wszystkie karty.
> ipconfig /renew EL* ... Odnawia każde połączenie o nazwie
zaczynającej się od EL
> ipconfig /release *lok* ... Zwalnia wszystkie pasujące połączenia,
np. "Połączenie lokalne 1" lub
"Połączenie lokalne 2"
route
Obsługuje sieciowe tabele routingu.
ROUTE [-f] [-p] [polecenie [cel]
[MASK maska_sieci] [brama] [METRIC metryka] [IF interfejs]
-f Usuwa z tabel routingu wszystkie wpisy bram. Jeśli
użyte w połączeniu z jednym poleceń, czyści tabele
przed jego wykonaniem.
-p Jeśli użyte z poleceniem ADD, trasa pozostaje trwała
przy kolejnych uruchomieniach systemu. Domyślnie trasy
nie są zachowywane przy ponownym uruchomieniu systemu.
Ignorowane dla wszystkich pozostałych poleceń, które
zawsze mają wpływ na odpowiednie trasy trwałe. Opcja
ta nie jest obsługiwana w systemie Windows 95.
polecenie Jedno z następujących:
PRINT Drukuje trasę
ADD Dodaje trasę
DELETE Usuwa trasę
CHANGE Modyfikuje istniejącą trasę
cel Określa hosta docelowego.
MASK Wskazuje, że następny parametr to wartość maski sieci.
maska_sieci Określa wartość maski podsieci dla tego wpisu trasy.
Jeśli maska_sieci nie zostanie podana, to jest stosowana
domyślna 255.255.255.255.
brama Określa bramę.
interfejs Numer interfejsu dla określonej trasy.
METRIC Określa metrykę, tj. koszt dotarcia do celu.
Wszystkie symboliczne nazwy używane dla miejsca docelowego są wyszukiwane
w pliku bazy danych sieci, NETWORKS. Symboliczne nazwy bram są wyszukiwane
w pliku bazy danych hostów, HOSTS.
Jeśli poleceniem jest PRINT lub DELETE, to cel i bramę można określić za
pomocą symbolu wieloznacznego, (symbolem wieloznacznym jest tu gwiazdka '*'),
można też pominąć argument 'brama'.
Jeśli 'cel' zawiera * lub ?, jest traktowany jako wzorzec i są drukowane
zgodne trasy docelowe. Gwiazdka '*' odpowiada dowolnemu ciągowi znaków,
a '?' - jednemu znakowi. Przykłady: 157.*.1, 157.*, 127.*, *224*.
Uwagi diagnostyczne:
Nieprawidłowy parametr MASK generuje błąd. Gdy np. (DEST i MASK) != DEST.
Przykład> route ADD 157.0.0.0 MASK 155.0.0.0 157.55.80.1 IF 1
Nie można dodać trasy: Podany parametr maski jest nieprawidłowy.
(Cel i Maska) != Cel.
Przykłady:
> route PRINT
> route ADD 157.0.0.0 MASK 255.0.0.0 157.55.80.1 METRIC 3 IF 2
cel^ ^maska ^brama metryka^ ^
Interfejs^
Jeśli interfejs (IF) nie zostanie określony, to jest podejmowana
próba znalezienia najlepszego interfejsu dla bramy.
> route PRINT
> route PRINT 157* .... Drukuje tylko zgodne z wzorcem 157*
> route CHANGE 157.0.0.0 MASK 255.0.0.0 157.55.80.5 METRIC 2 IF 2
CHANGE służy do modyfikowania tylko bramy i/lub metryki.
> route PRINT
> route DELETE 157.0.0.0
> route PRINT
arp
Wyświetla i modyfikuje tabelę translacji adresów IP do adresów
fizycznych używanych przez protokół rozróżniania adresów (ARP).
ARP -s inet_addr eth_addr [if_addr]
ARP -d inet_addr [if_addr]
ARP -a [inet_addr] [-N if_addr]
-a Wyświetla bieżące wpisy protokołu ARP przez odpytywanie
bieżących danych protokołu. Jeżeli inet_addr jest
określony, to wyświetlany jest adres IP i fizyczny dla
określonego komputera. Jeżeli więcej niż jeden interfejs
sieciowy korzysta z protokołu ARP, to wyświetlane są wpisy dla
każdej tabeli protokołu ARP.
-g To samo co -a.
inet_addr Określa adres internetowy.
-N if_addr Wyświetla wpisy protokołu ARP dla interfejsu sieciowego
określonego przez if_addr.
-d Usuwa hosta określonego przez inet_addr. W inet_addr można
użyć symbolu wieloznacznego * do usunięcia wszystkich hostów.
-s Dodaje hosta i kojarzy adres internetowy inet_addr
z fizycznym adresem internetowym eth_addr. Adres
fizyczny jest reprezentowany przez 6 szesnastkowych
bajtów oddzielonych znakami łącznika. Wpis dokonywany
jest na stałe.
eth_addr Określa adres fizyczny.
if_addr Jeżeli jest określony, to wskazuje adres interfejsu, którego
tabela translacji powinna zostać zmieniona.
Jeżeli nie jest określony, zostanie użyty pierwszy
odpowiadający interfejs.
Przykłady:
> arp -s 157.55.85.212 00-aa-00-62-c6-09 .... Dodaje statyczny wpis.
> arp -a .... Wyświetla tabelę arp.
ping
Sposób użycia: ping [-t] [-a] [-n liczba] [-l rozmiar] [-f] [-i TTL] [-v TOS]
[-r liczba] [-s liczba] [[-j lista_hostów] | [-k lista_hostów]]
[-w limit_czasu] nazwa_celu
Opcje:
-t Odpytuje określonego hosta do czasu zatrzymania.
Aby przejrzeć statystyki i kontynuować,
naciśnij klawisze Ctrl+Break.
Aby zakończyć, naciśnij klawisze Ctrl+C.
-a Tłumacz adresy na nazwy hostów.
-n liczba Liczba wysyłanych powtórzeń żądania.
-l rozmiar Rozmiar buforu transmisji.
-f Ustaw w pakiecie flagę "Nie fragmentuj".
-i TTL Czas wygaśnięcia.
-v TOS Typ usługi.
-r liczba Rejestruj trasę dla przeskoków.
-s liczba Sygnatura czasowa dla przeskoków.
-j lista_hostów Swobodna trasa źródłowa wg listy lista_hostów.
-k lista_hostów Ściśle określona trasa źródłowa wg listy lista_hostów.
-w limit_czasu Limit czasu oczekiwania na odpowiedź (w milisekundach).
tracert
Sposób użycia: tracert [-d] [-h maks_przes] [-j lista_hostów] [-w limit_czasu] cel
Opcje:
-d Nie rozpoznawaj adresów jako nazw hostów.
-h maks_przes Maksymalna liczba przeskoków w poszukiwaniu celu.
-j lista_hostów Swobodna trasa źródłowa według listy lista_hostów.
-w limit_czasu Limit czasu oczekiwania na odpowiedź w milisekundach.
nslookup
nslookup
> help
Polecenia: (identyfikatory są podane wielkimi literami, [ ] oznacza
parametr opcjonalny)
NAZWA - drukuje informacje o hoście/domenie NAZWA używając
serwera domyślnego
NAZWA1 NAZWA2 - jak powyżej, lecz NAZWA2 oznacza serwer
help or ? - drukuje informacje o najczęściej używanych poleceniach
set OPCJA - ustawia opcję
all - drukuje opcje, informacje o bieżącym serwerze i hoście
[no]debug - drukuje informacje debugera
[no]d2 - drukuje szczegółowe informacje debugera
[no]defname - dołącza nazwę domeny do każdej kwerendy
[no]recurse - prosi o rekursyjną odpowiedź na kwerendę
[no]search - używa listy przeszukiwania domen
[no]vc - zawsze używa obwodu wirtualnego
domain=NAZWA - ustawia domyślną nazwę domeny na NAZWA
srchlist=N1[/N2/.../N6]
- ustawia domenę na N1, a listę przeszukiwania na N1,N2 itd.
root=NAZWA - ustawia serwer główny na NAZWA
retry=X - ustawia liczbę ponawianych prób na X
timeout=X - ustawia początkowy limit czasu na X sekund
type=X - ustawia typ kwerendy (np. A, ANY, CNAME, MX, NS, PTR, SOA, SRV)
querytype=X - identyczne znaczenie, jak type
class=X - ustawia klasę zapytania (np. IN (Internet), ANY)
[no]msxfr - używa szybkiego transferu strefy MS
ixfrver=X - bieżąca wersja do użycia w żądaniu transferu IXFR
server NAZWA - ustawia domyślny serwer na NAZWA, używając bieżącego
serwera domyślnego
lserver NAZWA - ustawia domyślny serwer na NAZWA, używając serwera
początkowego
finger [UŻYTKOWNIK]
- uzyskuje informacje o UŻYTKOWNIKU opcjonalnym z bieżącego
hosta domyślnego
root - ustawia bieżący serwer domy_lny jako główny
ls [opt] DOMENA [> PLIK]
- wyświetla adresy w DOMENIE (opcjonalne: kieruje wyniki do PLIKU)
-a - wyświetla kanoniczne nazwy i aliasy
-d - wyświetla wszystkie rekordy
-t TYP - wyświetla rekordy określonego typu (np. A, CNAME, MX, NS, PTR itd.)
view PLIK - sortuje plik wynikowy polecenia ls i wyświetla go używając pg
exit - kończy pracę programu
> exit
netstat
Wyświetla statystykę protokołu i bieżące połączenia sieciowe TCP/IP.
NETSTAT [-a] [-b] [-e] [-n] [-o] [-p protokół] [-r] [-s] [-v] [interwał]
-a Wyświetla wszystkie połączenia i porty nasłuchiwania.
-b Wyświetla plik wykonywalny zaangażowany w tworzenie każdego
połączenia lub portu nasłuchiwania. W niektórych wypadkach
dobrze znane pliki wykonywalne obsługują wiele niezależnych,
składników i wtedy wyświetlona zostanie sekwencja składników
zaangażowanych w tworzenie połączenia lub portu nasłuchiwania.
W tym przypadku nazwa pliku wykonywalnego jest umieszczona
w nawiasach [] u dołu, a u góry jest składnik wywoływany.
Sekwencja kończy się na protokole TCP/IP. Należy zauważyć, że
wykonanie tej opcji może zająć dużo czasu i nie powiedzie się,
jeśli nie masz wystarczających uprawnień.
-e Wyświetla statystykę sieci Ethernet. Ta opcja może być używana
razem z opcją -s.
-n Wyświetla adresy i numery portów w postaci liczbowej.
-o Wyświetla dla każdego połączenia skojarzony z nim
identyfikator procesu będącego jego właścicielem.
-p protokół Wyświetla połączenia dla określonego protokołu; może to być
protokół TCP, UDP, TCPv6 lub UDPv6. Jeżeli ta opcja zostanie
użyta razem z opcją -s do wyświetlenia statystyki wybranego
protokołu, protokół może mieć dowolną wartość z następujących:
IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP lub UDPv6.
-r Wyświetla tabelę routingu.
-s Wyświetla statystykę wybranego protokołu. Domyślnie jest to
statystyka protokołów IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP
i UDPv6; do określenia jej podzbioru można użyć opcji -p.
-v Jeżeli ta opcja zostanie użyta razem z opcją -b, zostanie
wyświetlona sekwencja składników zaangażowanych w tworzenie
połączenia lub portu nasłuchiwania dla wszystkich plików
wykonywalnych.
interwał Wyświetla wybraną statystykę, odczekując zadaną liczbę sekund
pomiędzy każdym wyświetleniem. Naciśnij klawisze CTRL+C, aby
przerwać wyświetlanie statystyki. Jeżeli ta zmienna nie
zostanie określona, program netstat wydrukuje informacje
o aktualnej konfiguracji jeden raz.
Literatura
http://wazniak.mimuw.edu.pl/index.php?title=Sieci_komputerowe
http://sourceforge.net/projects/xming/
http://zsk.wsti.pl/publikacje/iptables_przystepnie.htm