summaryrefslogtreecommitdiffstats
path: root/inf/rn/dok/lyx/eksperimentalni.lyx
diff options
context:
space:
mode:
authorAnton Luka Šijanec <anton@sijanec.eu>2023-02-27 00:15:03 +0100
committerAnton Luka Šijanec <anton@sijanec.eu>2023-02-27 00:15:03 +0100
commit3fed51e23753255ffc6e660aaacf926e8ac735e7 (patch)
treedd815583d778fe36343d1843d30d4fb0d61d41e1 /inf/rn/dok/lyx/eksperimentalni.lyx
parentinf rn lyx (diff)
downloadsola-gimb-4-3fed51e23753255ffc6e660aaacf926e8ac735e7.tar
sola-gimb-4-3fed51e23753255ffc6e660aaacf926e8ac735e7.tar.gz
sola-gimb-4-3fed51e23753255ffc6e660aaacf926e8ac735e7.tar.bz2
sola-gimb-4-3fed51e23753255ffc6e660aaacf926e8ac735e7.tar.lz
sola-gimb-4-3fed51e23753255ffc6e660aaacf926e8ac735e7.tar.xz
sola-gimb-4-3fed51e23753255ffc6e660aaacf926e8ac735e7.tar.zst
sola-gimb-4-3fed51e23753255ffc6e660aaacf926e8ac735e7.zip
Diffstat (limited to 'inf/rn/dok/lyx/eksperimentalni.lyx')
-rw-r--r--inf/rn/dok/lyx/eksperimentalni.lyx1320
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