Udp File Share - ver 0.5b beta
Table of Contents
|
plik z podstawowymi formantami wikidot (czytelnymi dla człowieka).
Aby obejrzeć najnowszą sformatowaną wersję dokmentacji oraz programu,
jak również dokumentację źródeł (doxygen) zapraszam na http://www.grzegorz.wierzowiecki.pl/code:2007-01-udpfileshare .
Dokumentacja źródeł znajduje się na stornie http://www.grzegorz.wierzowiecki.pl/projects/sko/ufs/docs/ .
Download : A same źródła można ściągnąć stąd: http://www.grzegorz.wierzowiecki.pl/projects/sko/ufs/ .
Wstęp, czyli do czego ten program
Przepraszam ale niestety wersja ta jest nieco niedokonczona.
Na stronie projektu znajduje się najnowsza wersja.
Program w obecnej wersji pozwala na dzielenie pliku między użytkownikami (tymczasowo ręczny dobór źródła (potem dodane zostanie wybieranie na przemian jednego z listy)).
Uwagi do obecnej wersji.
Ta wersja jest pierwszą i przez to posiada ograniczenie do obsługi jednego pliku i jednego źródła danych. Niemniej jednak jest zaprojektowana pod kątem dużej liczby źródeł i plików więc nie stoi nic na przezkodzie by tę funkcjonalność dodać.
W plikach USI informacja o kawałku jest przechowywana przez jeden bajt o wartosci '0' lub '1' (to dla łatwiejszego obserwowania działania programu. łatwo to przerobić).
Autor i licencja
Autorem programu jest Grzegorz Wierzowiecki.
Program jest na licencji GPL.
Jeżeli Ci ta licencja z jakiś względów nie odpowiada skontaktuj się ze mną, a może zgodzę się wydać kod lub jego fragment na innej.
Instrukcja użycia
Download
http://www.grzegorz.wierzowiecki.pl/projects/sko/ufs/
Instalacja
ściągnięte archiwum z programem np. udpfileshare_verX.Y.tar.bz2 rozpakowujemy i wchodzimy do katalogu programu. ( pod X.Y trzeba wstawić numer i podnumer ściągniętej wersji)
tar xvjf udpfileshare_verX.Y.tar.bz2
cd udpfileshare_verX.Y
Kompilujemy
make
Aby wygenerować dokumentację źródeł używamy:
make doxy
Wywoływanie programu
Parametry ujęte w [ ] są opcjonalne.
udpfileshare [-f nazwapliku] [-ip adresip] [-p numerportu] [-h host1 [-h host2 [-h host3 ... ] ] ]
- nazwapliku
- nazwa pliku który ma być dzielony, bądź do którego ma być zapisany ściągnięty plik. ( domyślnie "udpsharedfile.dat" )
- adresip adres ip na którym program ma otworzyć gniazdo (domyślnie "*" = "any")
: numerportu - numer portu na którym ma otworzyć gniazdo (domyślnie 7542)
- hostn
- host który też dzieli plik. Można ich podać wiele.
(Są jeszcze w niektórych wesjach dostepne speciajne dodatkowe parametry ).
Pliki USI
Pliki usi to pliki w których program trzyma informacje na temat postępów ściągania pliku (tzn. jakie części zostały ściągnięte).
Domyślnie ma taką samą nazwę jak plik docelowy tylko dodatkowo końcówkę rozszerzenie ".usi".
T.j. dla pliku ala.avi będzie to ala.avi.usi .
Obecnie n-ty bit pliku równy 1 oznacza iż n-ta części pliku zostałą ściągnięta.
Pliki są dzielone na części po 4kB.
Zachowanie programu.
- Jeżeli plik posiada plik usi to program dzieli się częsciami które posiada i próbuje ściągnąć brakujące.
- Jeżeli brak pliku usi to program sprawdza czy plik istnieje. Jeżeli tak, to dzieli się znim w całości i zakłąda że jest kompletny, jeżeli brak pliku usi próbuje ściągnąć plik od hostów które posiada na liście.
- Początkowo lista hostów jest budowana z parametrów programu. Niemniej jednak, kolejne które się zgłoszą dodaje do listy.
- Program sprawdza poprawność każdej otrzymanej paczki danych za pomocą sumy kontrolnej. W przypadku braku zgodności - ignoruje.
Zasada działania
Program przesyła pliki w kawałkach (ang. parts) po 4kB.
Każdy plik posiada w pliku usi "mapę" ściągniętych kawałków.
Ogólny zarys protokołu.
Protokół został zprojektowany z myślą, zapewnienia możliwości łatwego wprowadzenia możliwości dzielenia wielu plików.
Obecnie dzielony jest jeden plik.
Budowa paczki.
Datagram UDP/IP.
Nagłówek IP |
Nagłówek UDP |
Nagłówek udpfileshare |
dane paczki |
Budowa dwuch najniższych warstw (nagłówek udpfileshare i dane):
offset (B) | wielkość pola (B) | znaczenie pola |
---|---|---|
0 | 4 | fileid - unikatowy identyfikator pliku1. |
4 | 2 | typ_paki - zgodnie z typem paczki |
6 | 4 | size - wielość pola danych (dl PI wyjątek!) |
10 | 4 | checksum - suma kontrolna |
14 | size | dane.(zależne od typu paczki) |
Dla paczki "DA" pierwsze 4 bajtow obszaru danych to: numer paczki, zwany "partnum".
Typy paczek oznaczone "*" są przewidziane ale obecnie nie zaimplementowane.
identyfikator paczki | nazwa | opis |
---|---|---|
RI | request info | prośba o paczki *HL, *FI, PI |
*HL | list of hosts | lista hostów które dzielą pliki |
PI | parts information | mapa posiadanych części |
RP | request parts | mapa części których się żąda od drugiej strony |
DA | data | paczka z kawałkiem pliku |
*RS | Requested checkSUMs | paczka z listą fragmentów plików, których sumę kontrolną prosi |
*SL | checkSUMs List | lista opisujaca framgenty plików i ich sumy kontrolne |
*RM | request md5sum | żądanie sumy md5 pliku |
*MD | md5sum | suma md5pliku |
Dla pola PI wyjątkiem jest pole size, które w paczce PI opisuje nie rozmiar pola danych, a rozmiar całego pliku.
Dodatkowe informacje
Liczba lini przedstawia się następująco :
komenda
wc -l *.cpp *.hpp '
daje wynik:
58 datatypes.hpp
142 file.hpp
194 network.hpp
178 file.cpp
311 network.cpp
259 udpfileshare.cpp
1142 razem
Opcje specjalne.
Program posiada parametry specjalne.
[-r n] - Oznacza iż losowo średnio 1 na n paczek ma poprawną sumę kontrolną.