diff options
Diffstat (limited to '')
-rw-r--r-- | inf/rn/dok/lyx/eksperimentalni.lyx | 1320 |
1 files changed, 1320 insertions, 0 deletions
diff --git a/inf/rn/dok/lyx/eksperimentalni.lyx b/inf/rn/dok/lyx/eksperimentalni.lyx new file mode 100644 index 0000000..a547c81 --- /dev/null +++ b/inf/rn/dok/lyx/eksperimentalni.lyx @@ -0,0 +1,1320 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass scrbook +\begin_preamble +% in case somebody want to have the label "Equation" +%\renewcommand{\eqref}[1]{Equation~(\negthinspace\autoref{#1})} + +% that links to image floats jumps to the beginning +% of the float and not to its caption +\usepackage[figure]{hypcap} + +% the pages of the TOC is numbered roman +% and a pdf-bookmark for the TOC is added +\let\myTOC\tableofcontents +\renewcommand\tableofcontents{% + \frontmatter + \pdfbookmark[1]{\contentsname}{} + \myTOC + \mainmatter } + +% makes caption labels bold +% for more info about these settings, see +% https://ctan.org/tex-archive/macros/latex/contrib/koma-script/doc/scrguien.pdf +\setkomafont{captionlabel}{\bfseries} +\setcapindent{1em} + +% enables calculations +\usepackage{calc} + +% fancy page header/footer settings +% for more information see section 9 of +% ftp://www.ctan.org/pub/tex-archive/macros/latex2e/contrib/fancyhdr/fancyhdr.pdf +\renewcommand{\chaptermark}[1]{\markboth{#1}{#1}} +\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}} + +% increases the bottom float placement fraction +\renewcommand{\bottomfraction}{0.5} + +% avoids that floats are placed above its sections +\let\mySection\section\renewcommand{\section}{\suppressfloats[t]\mySection} + +% increases link area for cross-references and autoname them +% if you change the document language to e.g. French +% you must change "extrasenglish" to "extrasfrench" +% if you uncomment the following lines, you cannot use the reference version Ref+Text in LyX +%\AtBeginDocument{% +% \renewcommand{\ref}[1]{\autoref{#1}} +%} +%\def\refnamechanges{% +% \renewcommand*{\equationautorefname}[1]{} +% \renewcommand{\sectionautorefname}{sec.\negthinspace} +% \renewcommand{\subsectionautorefname}{sec.\negthinspace} +% \renewcommand{\subsubsectionautorefname}{sec.\negthinspace} +% \renewcommand{\figureautorefname}{Fig.\negthinspace} +% \renewcommand{\tableautorefname}{Tab.\negthinspace} +%} +%\@ifpackageloaded{babel}{\addto\extrasenglish{\refnamechanges}}{\refnamechanges} +\end_preamble +\options intoc,bibliography=totoc,index=totoc,BCOR10mm,captions=tableheading,titlepage +\use_default_options true +\master /usr/share/lyx/examples/thesis/thesis.lyx +\begin_modules +customHeadersFooters +\end_modules +\maintain_unincluded_children false +\language slovene +\language_package default +\inputencoding utf8 +\fontencoding global +\font_roman "lmodern" "default" +\font_sans "lmss" "default" +\font_typewriter "lmtt" "default" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts false +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures false +\graphics default +\default_output_format default +\output_sync 0 +\bibtex_command bibtex +\index_command default +\float_placement h +\paperfontsize 12 +\spacing single +\use_hyperref true +\pdf_title "Your title" +\pdf_author "Your name" +\pdf_bookmarks true +\pdf_bookmarksnumbered true +\pdf_bookmarksopen true +\pdf_bookmarksopenlevel 1 +\pdf_breaklinks false +\pdf_pdfborder true +\pdf_colorlinks false +\pdf_backref false +\pdf_pdfusetitle false +\pdf_quoted_options "pdfpagelayout=OneColumn, pdfnewwindow=true, pdfstartview=XYZ, plainpages=false" +\papersize a4paper +\use_geometry false +\use_package amsmath 2 +\use_package amssymb 2 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 0 +\use_minted 0 +\branch Standalone +\selected 1 +\filename_suffix 0 +\color #ff0000 +\end_branch +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 2 +\paragraph_separation skip +\defskip medskip +\is_math_indent 1 +\math_indentation default +\math_numbering_side default +\quotes_style german +\dynamic_quotes 0 +\papercolumns 1 +\papersides 2 +\paperpagestyle fancy +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Left Header +\begin_inset Argument 1 +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +chaptername +\end_layout + +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +thechapter +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +rightmark +\end_layout + +\end_inset + + +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +Enable page headers and add the chapter to the header line. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Right Header +\begin_inset Argument 1 +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +leftmark +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Left Footer +\begin_inset Argument 1 +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +thepage +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Center Footer + +\end_layout + +\begin_layout Right Footer +\begin_inset Argument 1 +status open + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +thepage +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Chapter +Eksperimentalni del +\end_layout + +\begin_layout Standard +Namen raziskovalne naloge je prenesti čim več info slovarjev iz metainfo + slovarjev/torrent datotek. + V ta namen sem po standardih implementiral odjemalec BitTorrent, vendar + nepopolno, le do te mere, da zna sodelovati v DHT in prenašati metapodatke. +\end_layout + +\begin_layout Section +Program travnik +\end_layout + +\begin_layout Standard +Program travnik je spisan v programskem jeziku C in sestoji iz več komponent, + ki se med seboj povezujejo kot t. + i. + +\shape italic +single-header +\shape default + knjižnice, na koncu pa se povežejo v programsko datoteko, ki se ob zagonu + poveže v DHT mrežo in v njej prenese en torrent ter prestreže vse infohashe + torrentov, za katere dobi poizvedbe +\family typewriter +get_peers +\family default +. + Najdene infohashe doda v seznam torrentov, za katere bo poizkušal prejeti + soležnike, ko soležnike prejme, pa enega za drugim sprašuje za metapodatke. + Ko metapodatke enkrat prenese, jih ne za torrent ne bo več prenašal. +\end_layout + +\begin_layout Standard +Izdelani program ne implementira možnosti oddajanja metapodatkov, omogoča + pa shranjevanje in še vedno deluje kot veljavno DHT vozlišče. +\end_layout + +\begin_layout Standard +Izvorna koda programa je dostopna na +\begin_inset CommandInset href +LatexCommand href +name "http://ni.šijanec.eu./sijanec/travnik/" +target "http://ni.sijanec.eu./sijanec/travnik/" +literal "false" + +\end_inset + +. +\end_layout + +\begin_layout Subsection +Implementacija bkodiranja ( +\family typewriter +src/bencoding.c +\family default +) +\end_layout + +\begin_layout Standard +Za dekodiranje in enkodiranje bkodiranih objektov sem spisal v C spisal + knjižnico, ki bencoding objekte dekodira v objektno strukturo, na kateri + omogoči osnovne operacije, kot so iskanje ključev, zanka preko celotnega + seznama ali slovarja, vstavljanje novih elementov, brisanje elementov ter + dupliciranje elementov. + Deserializirana oblika je drevo elementov strukture bencoding: +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +begin{lstlisting}[language=C] +\end_layout + +\begin_layout Plain Layout + +struct bencoding { +\end_layout + +\begin_layout Plain Layout + + struct bencoding * next; +\end_layout + +\begin_layout Plain Layout + + struct bencoding * prev; +\end_layout + +\begin_layout Plain Layout + + struct bencoding * child; +\end_layout + +\begin_layout Plain Layout + + struct bencoding * parent; +\end_layout + +\begin_layout Plain Layout + + enum benc type; +\end_layout + +\begin_layout Plain Layout + + struct bencoding * key; +\end_layout + +\begin_layout Plain Layout + + char * value; +\end_layout + +\begin_layout Plain Layout + + size_t valuelen; +\end_layout + +\begin_layout Plain Layout + + long int intvalue; +\end_layout + +\begin_layout Plain Layout + + int index; +\end_layout + +\begin_layout Plain Layout + + unsigned seqnr; +\end_layout + +\begin_layout Plain Layout + + const char * after; /**< zaseben atribut */ +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + + +\backslash +end{lstlisting} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Za izdelavo in prevajanje med oblikami so med drugim na voljo sledeče funkcije: +\end_layout + +\begin_layout Itemize +za deserializacijo v drevo elementov je implementirana funkcija +\family typewriter +struct bencoding * bdecode (const char * vir, int len, enum benc opts) +\family default +, ki sezname in slovarje bere z rekurzivnim klicem +\end_layout + +\begin_layout Itemize +za serializacijo v bencoding funkcija +\family typewriter +char * bencode (char * dest, struct bencoding * b) +\family default + +\end_layout + +\begin_layout Itemize + +\family typewriter +char * b2json (char * dest, struct bencding * b) +\family default + za serializacijo v JSON za namene razhroščevanja in obdelave podatkov. +\begin_inset Newline newline +\end_inset + +JSON sicer ne more popolnoma reprezentirati podatkov, ki jih reprezentira + bkodiranje, saj morajo biti vsi nizi v obliki UTF-8, česar bencoding ne + zagotavlja (tam so lahko v nizih poljubni bajti). + Kljub temu pa obstajajo JSON bralniki, ki podpirajo poljubne bajte v nizih. +\end_layout + +\begin_layout Standard +Za urejanje in branje obstoječih bencoding dreves so med drugim na voljo + sledeče funkcije: +\end_layout + +\begin_layout Itemize + +\family typewriter +struct bencoding * bstr (char * str) +\family default +, ki izdela bencoding niz iz Cjevskega +\end_layout + +\begin_layout Itemize + +\family typewriter +struct bencoding * bnum (long nr) +\family default +, ki izdela bencoding število iz Cjevskega +\end_layout + +\begin_layout Itemize + +\family typewriter +void binsert (struct bencoding * benc, struct bencoding * elem) +\family default +, ki vstavi nov element v slovar/seznam +\end_layout + +\begin_layout Itemize + +\family typewriter +void bdetach (struct bencoding * elem) +\family default +, ki brez uničenja odstrani element iz slovarja/seznama +\end_layout + +\begin_layout Itemize + +\family typewriter +struct bencoding * bpath (const struct bencoding * benc, const char * key) +\family default +, ki vrne bencoding element na ključu, ki je podan kot niz (recimo +\family typewriter +r/nodes6 +\family default +) +\end_layout + +\begin_layout Itemize + +\family typewriter +bforeach(list, elem) {} +\family default + kontrolna struktura (makro), ki izvede blok kode za vsak element seznama/slovar +ja +\end_layout + +\begin_layout Itemize + +\family typewriter +struct bencoding * bval (struct bencoding * benc, struct bencoding * val) +\family default +, ki najde vrednost v slovarju/seznamu glede na njeno vrednost +\end_layout + +\begin_layout Itemize + +\family typewriter +struct bencoding * bclone (struct bencoding * b) +\family default +, ki duplicira bencoding drevo +\end_layout + +\begin_layout Subsection +Implementacija DHT ( +\family typewriter +src/dht.c +\family default +) +\end_layout + +\begin_layout Standard +Celotno povezovanje z vozlišči je spisano v knjižnici za DHT. + Ta opiše več struktur in operacij z njimi. + Ureja povezovanje na DHT vozlišča in tudi TCP za prenos metapodatkov. + Vzpostavi eno UDP vtičnico, preko katere komunicira s svetom. + Z bkodiranim seznamom, ki ga uporabnik knjižnice shrani na disk, je omogočena + tudi obstojna shramba podatkov, da lahko od zagona do zagona DHT ohranja + usmerjevalno tabelo, številko vrat in ID vozlišča. +\end_layout + +\begin_layout Standard +Mišljeno je, da program deluje z eno nitjo, zato je knjižnica izdelana tako, + da se koda izvaja periodično in da knjižnica nikoli ne ustavi izvajanja + s sistemskim klicem, temveč se poslužuje zunanjega +\family typewriter +poll(2) +\family default + klica v dogodkovni zanki. +\end_layout + +\begin_layout Subsubsection +Podatkovne strukture +\end_layout + +\begin_layout Standard +V tej rubriki so navedene le podatkovne strukture, ki so namenjene uporabniku, + ne strukture interne implementacije knjižnice, ker bi jih bilo preveč. +\end_layout + +\begin_layout Standard +Za razliko od tradicionalne implementacije +\family typewriter +dht.c +\family default +, ki jo uporablja velik del obstoječih BitTorrent odjemalcev, je ta knjižnica + popolnoma samostojna/brez stanja, v smislu da ne uporablja globalnih spremenlji +vk in lahko v enem procesu obstaja večkrat. + Oprimek (angl. + +\shape italic +handle +\shape default +) knjižnice je kazalec na Cjevsko strukturo: +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +begin{lstlisting}[language=C] +\end_layout + +\begin_layout Plain Layout + +struct dht { +\end_layout + +\begin_layout Plain Layout + + unsigned char id[20]; // ID vozlišča +\end_layout + +\begin_layout Plain Layout + + int socket; // vtičnica za UDP komunikacijo +\end_layout + +\begin_layout Plain Layout + + unsigned char secret[16]; // AES ključ za announce žeton +\end_layout + +\begin_layout Plain Layout + + FILE * log; // stdio za dnevnik +\end_layout + +\begin_layout Plain Layout + + struct bucket * buckets; // shramba košev +\end_layout + +\begin_layout Plain Layout + + struct bucket * buckets6; // shramba košev IPv6 +\end_layout + +\begin_layout Plain Layout + + struct torrent * torrents; // shramba torrentov +\end_layout + +\begin_layout Plain Layout + + void (* possible_torrent)(struct dht *, +\end_layout + +\begin_layout Plain Layout + + const unsigned char *, struct torrent *); +\end_layout + +\begin_layout Plain Layout + + void * userdata; +\end_layout + +\begin_layout Plain Layout + + unsigned torrents_num; +\end_layout + +\begin_layout Plain Layout + + unsigned peers_num; +\end_layout + +\begin_layout Plain Layout + + unsigned peers_max; +\end_layout + +\begin_layout Plain Layout + + struct torrent * last_torrent; +\end_layout + +\begin_layout Plain Layout + + unsigned peers_per_torrent_max; +\end_layout + +\begin_layout Plain Layout + + unsigned time; // čas zagona +\end_layout + +\begin_layout Plain Layout + + unsigned rxp; // prejetih paketov +\end_layout + +\begin_layout Plain Layout + + unsigned txp; // poslanih paketov +\end_layout + +\begin_layout Plain Layout + + unsigned rxb; // prejetih bajtov +\end_layout + +\begin_layout Plain Layout + + unsigned txb; // poslanih bajtov +\end_layout + +\begin_layout Plain Layout + + unsigned tcp_max; // omejitev TCP povezav +\end_layout + +\begin_layout Plain Layout + + void (* possible_torrent)(struct dht *, +\end_layout + +\begin_layout Plain Layout + + const unsigned char *, struct torrent *); +\end_layout + +\begin_layout Plain Layout + + unsigned tt; // poslanih bajtov po TCP +\end_layout + +\begin_layout Plain Layout + + unsigned tr; // prejetih bajtov po TCP +\end_layout + +\begin_layout Plain Layout + + unsigned p; // število poslanih pingov +\end_layout + +\begin_layout Plain Layout + + struct sockaddr_in6 pings[PINGS_CAP]; +\end_layout + +\begin_layout Plain Layout + + unsigned periods; // število klicev periodic() +\end_layout + +\begin_layout Plain Layout + + unsigned rxqp; // prejetih zahtev +\end_layout + +\begin_layout Plain Layout + + unsigned txqp; // prejetih zahtev +\end_layout + +\begin_layout Plain Layout + + unsigned rxrp; // prejetih odzivov +\end_layout + +\begin_layout Plain Layout + + unsigned txrp; // poslanih odzivov +\end_layout + +\begin_layout Plain Layout + + unsigned removed_torrents; +\end_layout + +\begin_layout Plain Layout + +}; +\end_layout + +\begin_layout Plain Layout + + +\backslash +end{lstlisting} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Torrent je reprezentiran v strukturi +\family typewriter +torrent +\family default +. + Ker je vsak torrent lahko povezan na enega soležnika hkrati, struktura + vsebuje tudi atribute soležnika: +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +begin{lstlisting}[language=C] +\end_layout + +\begin_layout Plain Layout + +struct torrent { +\end_layout + +\begin_layout Plain Layout + + unsigned char ut_metadata; // če soležnik podpira +\end_layout + +\begin_layout Plain Layout + + unsigned char ut_pex; // če soležnik podpira +\end_layout + +\begin_layout Plain Layout + + enum state state; +\end_layout + +\begin_layout Plain Layout + + int socket; // TCP vtičnica do soležnika oz. + -1 +\end_layout + +\begin_layout Plain Layout + + void * userdata; +\end_layout + +\begin_layout Plain Layout + + void (* disconnection)(struct torrent *); +\end_layout + +\begin_layout Plain Layout + + struct peer * dl; // povezani soležnik oz. + NULL +\end_layout + +\begin_layout Plain Layout + + time_t time; // začetek prenosa metapodatkov +\end_layout + +\begin_layout Plain Layout + + enum interested type; // announce, peers, info +\end_layout + +\begin_layout Plain Layout + + unsigned char hash[20]; // infohash +\end_layout + +\begin_layout Plain Layout + + struct peer * peers; +\end_layout + +\begin_layout Plain Layout + + struct node * nodes; +\end_layout + +\begin_layout Plain Layout + + struct torrent * next; +\end_layout + +\begin_layout Plain Layout + + struct torrent * prev; +\end_layout + +\begin_layout Plain Layout + + int progress; // število prenesenih delčkov +\end_layout + +\begin_layout Plain Layout + + int size; // velikost metapodatkov v bajtih +\end_layout + +\begin_layout Plain Layout + + unsigned char * metadata; // metapodatki, ki se nalagajo +\end_layout + +\begin_layout Plain Layout + + void (* intentions)(struct torrent *); +\end_layout + +\begin_layout Plain Layout + + unsigned char * packet; // paket, ki se še sestavlja +\end_layout + +\begin_layout Plain Layout + + int recvd; // število pridobljenih bajtov paketa +\end_layout + +\begin_layout Plain Layout + + char * software; // ime programa, ki teče na soležniku +\end_layout + +\begin_layout Plain Layout + + time_t ttl; // čas, po katerem naj obupam s prenosom +\end_layout + +\begin_layout Plain Layout + + unsigned canary; // interni atribut za razhroščevanje +\end_layout + +\begin_layout Plain Layout + +}; +\end_layout + +\begin_layout Plain Layout + + +\backslash +end{lstlisting} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Funkcije +\end_layout + +\begin_layout Standard +Uporabniku knjižnice so med drugim namenjene slednje funkcije: +\end_layout + +\begin_layout Itemize + +\family typewriter +struct torrent * add_torrent (struct dht * d, struct torrent * t) +\family default +, ki doda torrent v shrambo torrentov. + Praviloma uporabnik torrentu nastavi type na +\family typewriter +peers|info. +\end_layout + +\begin_layout Itemize + +\family typewriter +struct bencoding * persistent (const struct dht * d) +\family default +, ki vrne bkodiran slovar, ki naj ga uporabnik ob naslednjem zagonu posreduje + knjižnici +\end_layout + +\begin_layout Itemize + +\family typewriter +void work (struct dht * d) +\family default +, ki naj jo uporabnik pokliče, ko +\family typewriter +poll(2) +\family default + pove, da je možno brati na UDP vtičnici +\end_layout + +\begin_layout Itemize + +\family typewriter +void tcp_work (struct dht * d) +\family default +, ki naj jo uporabnik pokliče, ko +\family typewriter +poll(2) +\family default + pove, da je možno brati na TCP vtičnici +\end_layout + +\begin_layout Itemize + +\family typewriter +void periodic (struct dht * d) +\family default +, ki naj jo uporabnik pokliče vsakih 10 sekund, da se v DHT pošljejo poizvedbe + o torrentih in začnejo povezave za prenos metapodatkov. +\end_layout + +\begin_layout Standard +Poleg tega mora uporabnik skrbeti še za povratne klice (angl +\shape italic +callback +\shape default +): +\end_layout + +\begin_layout Itemize + +\family typewriter +void possible_torrent (struct dht *, const unsigned char *, struct torrent + *) +\family default +, ki uporabnika obvesti o najdenem infohashu v dohodni +\family typewriter +get_peers +\family default + zahtevi. + Uporabnik v tej funkciji nov torrent doda med torrente in zahteva prenos + metapodatkov. +\end_layout + +\begin_layout Itemize + +\family typewriter +void connection (struct dht *, struct torrent *) +\family default +, ki uporabnika obvesti, da naj v +\family typewriter +poll(2) +\family default + klicu gleda novo vtičnico +\family typewriter +torrent->socket +\family default +. +\end_layout + +\begin_layout Itemize + +\family typewriter +void disconnection (struct torrent *) +\family default +, ki uporabnika obvesti, da mora prenehati opazovati vtičnico +\family typewriter +torrent->socket +\family default + v +\family typewriter +poll(2) +\family default + klicu. + Uporabnik v tej funkciji tudi shrani metapodatke na disk, saj niso dostopni + ne prej ne kasneje. +\end_layout + +\begin_layout Itemize + +\family typewriter +void intentions (struct torrent *) +\family default +, ki uporabnika obvesti o željeni dejavnosti na TCP vtičnici (branje/pisanje), + ki jo prebere iz +\family typewriter +torrent->state +\end_layout + +\begin_layout Subsection +Servisni programi +\end_layout + +\begin_layout Standard +Za razhroščevanje in uporabo travnika sta priložena še dva samostoječa programa. + +\family typewriter +utils/bencoding.c +\family default + omogoča pretvorbo med bkodiranjem in JSONom ter omejeno urejanje bencoding + struktur iz ukazne vrstice preko standardnega vhoda in izhoda, +\family typewriter +utils/info.c +\family default + pa omogoča prenos metapodatkov torrenta s podanim infohashom iz specifičnega + naslova IP in vrat. +\end_layout + +\begin_layout Section +Algoritem prestrezanja podatkov +\end_layout + +\begin_layout Standard +Vedno, ko program zazna novo infohash, ga doda med torrente, katerih metapodatke + želi prenesti. + Vsak cikel desetih sekund (klic funkcije +\family typewriter +periodic +\family default +), bo program poiskal soležnike in vozlišča, ki so blizu temu infohashu. + Nato se bo za vsak torrent poizkusil povezati na enega izmed soležnikov, + na katega se še ni povezal, ter izvedel protokol, opisan v razdelku +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Povezava-na-soležnike" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +. + Medtem knjižnica konstantno izvaja povratne klice in spreminja stanje vtičnice + v klicu poll, ker za komunikacijo pričakuje bodisi zmožnost branja bodisi + zmožnost pisanja v vtičnico. +\end_layout + +\begin_layout Standard +Ko je slovar info prenesen in se infohash torrenta ujema z bodisi prvimi + dvajsetimi bajti zgoščene vrednosti SHA-256 bodisi zgoščeno vrednostjo + SHA-1, se torrent shrani v datoteko v trenutni direktorij ter odstrani + zahteva po nadaljnjem pridobivanju soležnikov in prenosu metapodatkov. +\end_layout + +\begin_layout Standard +Tako se bo v trenutnem direktoriju sproti nabralo veliko +\family typewriter +infohash.torrent +\family default + datotek. +\end_layout + +\begin_layout Standard +Da program prvič začne sodelovati z omrežjem, torej da ga sosednja vozlišča + vpišejo v svoje usmerjevalne tabele, prenese metapodatke vgrajenega torrenta + +\family typewriter +Big Buck Bunny +\family default +. +\end_layout + +\begin_layout Section +Obdelava podatkov +\end_layout + +\begin_layout Standard +Podatke sem sprva mislil obdelati tako, da bi jih shranjeval v relacijski + podatkovni zbirki tipa MySQL, zato sem spisal PHP program, ki s knjižnico + (citiraj Rhilip/Bencode) za razčlenjevanje metainfo datotek odpre vsako + datoteko in jo vstavi v podatkovno zbirko s tabelama +\family typewriter +torrenti +\family default + in +\family typewriter +datoteke +\family default +. + Z naraščajočim številom vrstic v podatkovni zbirki pa postanejo +\family typewriter +JOIN +\family default + operacije med tabelo s torrenti in tabelo z datotekami prepočasno. + Relacijske podatkovne zbirke namreč niso narejene za ta namen. + Alternativa njim so podatkovne zbirke, ki delajo na nivoju t. + i dokumentov. +\end_layout + +\begin_layout Standard +Sprva sem mislil uporabiti podatkovno orodje MongoDB (citiraj), vendar mi + je zaradi restriktivne licence in komercialno orientirane narave neprivlačen. +\end_layout + +\begin_layout Standard +Za izvajanje preprostih iskanj z regularnimi izrazi (angl. + +\shape italic +regular expression/RegEx +\shape default +) po celotnem seznamu datotek/torrentov, ki imajo tako ali tako +\begin_inset ERT +status open + +\begin_layout Plain Layout + +O(n) +\end_layout + +\end_inset + + kompleksnost, je v mojem primeru dovolj, če vse torrente hranim kot pythonski + +\family typewriter +dict +\family default + (slovar). + Za ohranitev tega slovarja v delovnem spominu za daljše časovno obdobje + in za uporaben uporabniški vmesnik sem izbral programsko orodje Jupyter + Notebook (citiraj), ki uporablja +\family typewriter +ipython +\family default + REPL in lahko znotraj dokumenta izrisuje grafe in ostale diagrame. +\end_layout + +\begin_layout Standard +Python uporabne knjižnice, ki podpira obe obliki torrent datotek, nima, + zato sem preprost vmesnik za razčlenjevanje datotek v objektne strukture + spisal sam (Priloga: +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:travnik.py-razčlenjevalnik-.torr" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +). +\end_layout + +\begin_layout Standard +Za hitrejšo implementacijo branja datotek sem razčlenjevalnik spisal tudi + v programskem jeziku C ( +\family typewriter +metainfo.c +\family default +), vendar ga vsled uporabniku prijaznejšega uporabniškega vmesnika Jupyter + v pythonskem okolju nisem pretirano pogosto uporabljal. +\end_layout + +\begin_layout Standard +\begin_inset Branch Standalone +inverted 0 +status open + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +The contents of this branch is only output if this chapter is processed + on its own, i. +\begin_inset space \thinspace{} +\end_inset + +e., not from the master. + This allows you to have a bibliography and a nomenclature if you only want + to output this chapter. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand include +filename "Bibliography.lyx" + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\end_body +\end_document |