[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [gnunet] branch master updated: doc: Start of half-manual c
From: |
gnunet |
Subject: |
[GNUnet-SVN] [gnunet] branch master updated: doc: Start of half-manual conversion from LaTeX to Texinfo for gnunet-c-tutorial. |
Date: |
Thu, 24 Aug 2017 15:21:32 +0200 |
This is an automated email from the git hooks/post-receive script.
ng0 pushed a commit to branch master
in repository gnunet.
The following commit(s) were added to refs/heads/master by this push:
new 834f1ec82 doc: Start of half-manual conversion from LaTeX to Texinfo
for gnunet-c-tutorial.
834f1ec82 is described below
commit 834f1ec8209254fb66dc2908d39852761f015c8f
Author: ng0 <address@hidden>
AuthorDate: Thu Aug 24 13:20:39 2017 +0000
doc: Start of half-manual conversion from LaTeX to Texinfo for
gnunet-c-tutorial.
---
...nunet-c-tutorial.tex => gnunet-c-tutorial.texi} | 408 ++++++++++-----------
1 file changed, 184 insertions(+), 224 deletions(-)
diff --git a/doc/gnunet-c-tutorial.tex b/doc/gnunet-c-tutorial.texi
similarity index 85%
rename from doc/gnunet-c-tutorial.tex
rename to doc/gnunet-c-tutorial.texi
index 13c975567..0c01cceab 100644
--- a/doc/gnunet-c-tutorial.tex
+++ b/doc/gnunet-c-tutorial.texi
@@ -1,73 +1,65 @@
-\documentclass[10pt]{article}
-\usepackage[ansinew]{inputenc}
-\usepackage{makeidx,amsmath,amssymb,exscale,multicol,epsfig,graphics,verbatim,ulem}
-\usepackage{epsfig,geometry,url,listings,subcaption}
-\usepackage{boxedminipage}
-\usepackage[T1]{fontenc}%required
-\usepackage{textcomp}
-\geometry{headsep=3ex,hscale=0.9}
-\usepackage{hyperref}
-\usepackage{color}
-\hypersetup{pdftitle={GNUnet C Tutorial},
- pdfsubject={GNUnet},
- pdfauthor={Christian Grothoff <address@hidden>},
- pdfkeywords={p2p,search,gnunet,tutorial}
- %,pdfpagemode={FullScreen}
- }
-
-
-\lstset{
-language=bash,
-basicstyle=\ttfamily,
-upquote=true,
-columns=fullflexible,
-literate={*}{{\char42}}1
- {-}{{\char45}}1
-}
+\input texinfo
address@hidden %**start of header
address@hidden gnunet-c-tutorial.info
address@hidden UTF-8
address@hidden GNUnet C Tutorial
address@hidden %**end of header
-\newcommand{\exercise}[1]{\noindent\begin{boxedminipage}{\textwidth}{\bf
Exercise:} #1 \end{boxedminipage}}
-
-\begin{document}
-
-\lstset{ %
-language=C, % choose the language of the code
-basicstyle=\footnotesize, % the size of the fonts that are used for the
code
-numbers=left, % where to put the line-numbers
-numberstyle=\footnotesize, % the size of the fonts that are used for the
line-numbers
-stepnumber=1, % the step between two line-numbers. If it is
1 each line will be numbered
-numbersep=5pt, % how far the line-numbers are from the code
-backgroundcolor=\color{white}, % choose the background color. You must add
\usepackage{color}
-showspaces=false, % show spaces adding particular underscores
-showstringspaces=false, % underline spaces within strings
-showtabs=false, % show tabs within strings adding particular
underscores
-frame=single, % adds a frame around the code
-tabsize=2, % sets default tabsize to 2 spaces
-captionpos=b, % sets the caption-position to bottom
-breaklines=true, % sets automatic line breaking
-breakatwhitespace=false, % sets if automatic breaks should only happen at
whitespace
-escapeinside={\%*}{*)} % if you want to add a comment within your code
-}
address@hidden
+Copyright @copyright{} 2001-2017 GNUnet e.V.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
+copy of the license is included in the section entitled ``GNU Free
+Documentation License''.
+
+A copy of the license is also available from the Free Software
+Foundation Web site at @url{http://www.gnu.org/licenses/fdl.html}.
+
+Alternately, this document is also available under the General
+Public License, version 3 or later, as published by the Free Software
+Foundation. A copy of the license is included in the section entitled
+``GNU General Public License''.
+
+A copy of the license is also available from the Free Software
+Foundation Web site at @url{http://www.gnu.org/licenses/gpl.html}.
address@hidden copying
address@hidden
address@hidden GNUnet C Tutorial
address@hidden A Tutorial for GNUnet 0.10.x (C version)
address@hidden The GNUnet Developers
-\begin{center}
-\large {A Tutorial for GNUnet 0.10.x (C version)}
address@hidden
address@hidden 0pt plus 1filll
-Christian Grothoff $\qquad$ Bart Polot $\qquad$ Matthias Wachs
address@hidden
address@hidden titlepage
+
address@hidden
+
address@hidden **** TODO
address@hidden 1. Update content?
address@hidden 2. Either reference main documentation or
address@hidden 3. Merge this into main documentation
+
address@hidden Top
address@hidden Introduction
-\today
-\end{center}
This tutorials explains how to install GNUnet on a GNU/Linux system and gives
an introduction on how
GNUnet can be used to develop a Peer-to-Peer application. Detailed
installation instructions for
various operating systems and a detailed list of all dependencies can be found
on our website at
-\url{https://gnunet.org/installation}.
address@hidden://gnunet.org/installation}.
-\textbf{Please read this tutorial carefully since every single step is
- important and do not hesitate to contact the GNUnet team if you have
- any questions or problems! Check here how to contact the GNUnet
- team: \url{https://gnunet.org/contact_information}}
+Please read this tutorial carefully since every single step is
+important and do not hesitate to contact the GNUnet team if you have
+any questions or problems! Check here how to contact the GNUnet
+team: @uref{https://gnunet.org/contact_information}
-\section{Installing GNUnet}
address@hidden Installing GNUnet
First of all you have to install a current version of GNUnet. You can download
a
tarball of a stable version from GNU FTP mirrors or obtain the latest
development
@@ -78,162 +70,142 @@ latest development version things can be broken,
functionality can be changed or
can fail. You should only use the development version if you know that you
require a
certain feature or a certain issue has been fixed since the last release.
-\subsection{Obtaining a stable version}
address@hidden Obtaining a stable version
You can download the latest stable version of GNUnet from GNU FTP mirrors:
-\begin{center}
-\url{ftp://ftp.gnu.org/gnu/gnunet/gnunet-0.10.x.tar.gz}
-\end{center}
address@hidden://ftp.gnu.org/gnu/gnunet/gnunet-0.10.x.tar.gz}
You should also download the signature file and verify the integrity of the
tarball.
-\begin{center}
-\url{ftp://ftp.gnu.org/gnu/gnunet/gnunet-0.10.x.tar.gz.sig}
-\end{center}
address@hidden://ftp.gnu.org/gnu/gnunet/gnunet-0.10.x.tar.gz.sig}
To verify the signature you should first import the GPG key used to sign the
tarball
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ gpg --keyserver keys.gnupg.net --recv-keys 48426C7E
-\end{lstlisting}
address@hidden example
And use this key to verify the tarball's signature
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ gpg --verify gnunet-0.10.x.tar.gz.sig gnunet-0.10.x.tar.gz
-\end{lstlisting}
address@hidden example
After successfully verifying the integrity you can extract the tarball using
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ tar xvzf gnunet-0.10.x.tar.gz
-$ mv gnunet-0.10.x gnunet # we will use the directory "gnunet" in
the remainder of this document
+## we will use the directory "gnunet" in the remainder of this document
+$ mv gnunet-0.10.x gnunet
$ cd gnunet
-\end{lstlisting}
address@hidden example
However, please note that stable versions can be very outdated, as a developer
-you are strongly encouraged to use the version from
\url{https://gnunet.org/git/}.
+you are strongly encouraged to use the version from
@uref{https://gnunet.org/git/}.
-\subsection{Installing Build Tool Chain and Dependencies}
address@hidden Installing Build Tool Chain and Dependencies
To successfully compile GNUnet you need the tools to build GNUnet and the
required dependencies.
-Please have a look at \url{https://gnunet.org/dependencies} for a list of
required dependencies
-and \url{https://gnunet.org/generic_installation} for specific instructions
for your operating system.
+Please have a look at @uref{https://gnunet.org/dependencies} for a list of
required dependencies
+and @uref{https://gnunet.org/generic_installation} for specific instructions
for your operating system.
Please check the notes at the end of the configure process about required
dependencies.
-For GNUnet bootstrapping support and the http(s) plugin you should install
\texttt{libgnurl}.
-For the filesharing service you should install at least one of the datastore
backends \texttt{mysql},
-\texttt{sqlite} or \texttt{postgresql}.
+For GNUnet bootstrapping support and the http(s) plugin you should install
libgnurl.
+For the filesharing service you should install at least one of the datastore
backends mysql,
+sqlite or postgresql.
-\subsection{Obtaining the latest version from Git}
address@hidden Obtaining the latest version from Git
The latest development version can obtained from our Git repository. To obtain
the code you need Git installed and checkout the repository using:
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ git clone https://gnunet.org/git/gnunet
-\end{lstlisting}
address@hidden example
After cloning the repository you have to execute
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ cd gnunet
$ ./bootstrap
-\end{lstlisting}
address@hidden example
The remainder of this tutorial assumes that you have Git Master checked out.
address@hidden Compiling and Installing GNUnet
-\subsection{Compiling and Installing GNUnet}
+First, you need to install at least libgnupgerror version 1.27
address@hidden://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.27.tar.bz2}
+and libgcrypt version 1.7.6
@uref{ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.7.6.tar.bz2}.
-First, you need to install at least {\tt libgnupgerror} version
-1.27\footnote{\url{ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.27.tar.bz2}}
-and {\tt libgcrypt} version
-1.7.6\footnote{\url{ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.7.6.tar.bz2}}.
-
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ wget ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.27.tar.bz2
$ tar xf libgpg-error-1.27.tar.bz2
$ cd libgpg-error-1.27
$ ./configure
$ sudo make install
$ cd ..
-\end{lstlisting}
address@hidden example
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.7.6.tar.bz2
$ tar xf libgcrypt-1.7.6.tar.bz2
$ cd libgcrypt-1.7.6
$ ./configure
$ sudo make install
$ cd ..
-\end{lstlisting}
address@hidden example
-\label{sub:install}
address@hidden sub:install
Assuming all dependencies are installed, the following commands will
compile and install GNUnet in your home directory. You can specify the
directory where GNUnet will be installed by changing the
-\lstinline|--prefix| value when calling \lstinline|./configure|. If
+--prefix value when calling ./configure. If
you do not specifiy a prefix, GNUnet is installed in the directory
-\lstinline|/usr/local|. When developing new applications you may want
-to enable verbose logging by adding
-\lstinline|--enable-logging=verbose|:
+/usr/local. When developing new applications you may want
+to enable verbose logging by adding --enable-logging=verbose:
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ ./configure --prefix=$PREFIX --enable-logging
$ make
$ make install
-\end{lstlisting}
address@hidden example
After installing GNUnet you have to add your GNUnet installation to your path
-environmental variable. In addition you have to create the \lstinline|.config|
+environmental variable. In addition you have to create the .config
directory in your home directory where GNUnet stores its data and an empty
GNUnet configuration file:
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ export PATH=$PATH:$PREFIX/bin
$ echo export PATH=$PREFIX/bin:\\$PATH >> ~/.bashrc
$ mkdir ~/.config/
$ touch ~/.config/gnunet.conf
-\end{lstlisting}
-% $
address@hidden
-\subsection{Common Issues - Check your GNUnet installation}
address@hidden Common Issues - Check your GNUnet installation
You should check your installation to ensure that installing GNUnet
was successful up to this point. You should be able to access GNUnet's
binaries and run GNUnet's self check.
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ which gnunet-arm
-\end{lstlisting}
-should return \lstinline|$PREFIX/bin/gnunet-arm|. It should be
address@hidden example
+should return $PREFIX/bin/gnunet-arm. It should be
located in your GNUnet installation and the output should not be
empty. If you see an output like:
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ which gnunet-arm
-$
-\end{lstlisting}
-check your {\tt PATH} variable to ensure GNUnet's {\tt bin} directory is
included.
address@hidden example
+check your PATH variable to ensure GNUnet's bin directory is included.
GNUnet provides tests for all of its subcomponents. Run
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ make check
-\end{lstlisting}
-to execute tests for all components. {\tt make check} traverses all
subdirectories in {\tt src}.
address@hidden example
+to execute tests for all components. make check traverses all subdirectories
in src.
For every subdirectory you should get a message like this:
-\begin{verbatim}
address@hidden
make[2]: Entering directory `/home/$USER/gnunet/contrib'
PASS: test_gnunet_prefix
=============
1 test passed
=============
-\end{verbatim}
address@hidden
-\section{Background: GNUnet Architecture}
address@hidden Background: GNUnet Architecture
GNUnet is organized in layers and services. Each service is composed of a
main service implementation and a client library for other programs to use
@@ -273,112 +245,102 @@ clients communicate via a message protocol to be
defined and implemented by
the programmer.
-\section{First Steps with GNUnet}
address@hidden First Steps with GNUnet
-\subsection{Configure your peer}
address@hidden Configure your peer
-First of all we need to configure your peer. Each peer is started with a
configuration containing settings for GNUnet itself and its services. This
configuration is based on the default configuration shipped with GNUnet and can
be modified. The default configuration is located in the {\tt
\$PREFIX/share/gnunet/config.d} directory. When starting a peer, you can
specify a customized configuration using the the {\tt$-c$} command line switch
when starting the ARM service and all other servic [...]
+First of all we need to configure your peer. Each peer is started with a
configuration containing settings for GNUnet itself and its services. This
configuration is based on the default configuration shipped with GNUnet and can
be modified. The default configuration is located in the
$PREFIX/share/gnunet/config.d directory. When starting a peer, you can specify
a customized configuration using the the $-c$ command line switch when starting
the ARM service and all other services. When usi [...]
Since we want to start additional peers later, we need
some modifications from the default configuration. We need to create a
separate service home and a file containing our modifications for this peer:
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ mkdir ~/gnunet1/
$ touch peer1.conf
-\end{lstlisting}
address@hidden example
Now add the following lines to peer1.conf to use this directory. For
simplified usage we want to prevent the peer to connect to the GNUnet
network since this could lead to confusing output. This modifications
will replace the default settings:
-\begin{verbatim}
address@hidden
[PATHS]
GNUNET_HOME = ~/gnunet1/ # Use this directory to store GNUnet
data
[hostlist]
SERVERS = # prevent bootstrapping
-\end{verbatim}
address@hidden example
-
-\subsection{Start a peer}
-Each GNUnet instance (called peer) has an identity (\textit{peer ID}) based on
a
address@hidden Start a peer
+Each GNUnet instance (called peer) has an identity (peer ID) based on a
cryptographic public private key pair. The peer ID is the printable hash of the
public key.
-GNUnet services are controlled by a master service the so called
\textit{Automatic Restart Manager} (ARM).
+GNUnet services are controlled by a master service the so called Automatic
Restart Manager (ARM).
ARM starts, stops and even restarts services automatically or on demand when a
client connects.
-You interact with the ARM service using the \lstinline|gnunet-arm| tool.
-GNUnet can then be started with \lstinline|gnunet-arm -s| and stopped with
-\lstinline|gnunet-arm -e|. An additional service not automatically started
-can be started using \lstinline|gnunet-arm -i <service name>| and stopped
-using \lstinline|gnunet-arm -k <servicename>|.
+You interact with the ARM service using the gnunet-arm tool.
+GNUnet can then be started with gnunet-arm -s and stopped with
+gnunet-arm -e. An additional service not automatically started
+can be started using gnunet-arm -i <service name> and stopped
+using gnunet-arm -k <servicename>.
Once you have started your peer, you can use many other GNUnet commands
to interact with it. For example, you can run:
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ gnunet-peerinfo -s
-\end{lstlisting}
address@hidden example
to obtain the public key of your peer.
You should see an output containing the peer ID similar to:
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
I am peer `0PA02UVRKQTS2C .. JL5Q78F6H0B1ACPV1CJI59MEQUMQCC5G'.
-\end{lstlisting}
address@hidden example
-\subsection{Monitor a peer}
address@hidden Monitor a peer
In this section, we will monitor the behaviour of our peer's DHT service with
respect to a
specific key. First we will start GNUnet and then start the DHT service and
use the DHT monitor tool
-to monitor the PUT and GET commands we issue ussing the
\lstinline|gnunet-dht-put| and
-\lstinline|gnunet-dht-get| commands. Using the ``monitor'' line given below,
you can observe the behavior of
+to monitor the PUT and GET commands we issue ussing the gnunet-dht-put and
+gnunet-dht-get commands. Using the ``monitor'' line given below, you can
observe the behavior of
your own peer's DHT with respect to the specified KEY:
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ gnunet-arm -c ~/peer1.conf -s # start gnunet with all
default services
$ gnunet-arm -c ~/peer1.conf -i dht # start DHT service
$ cd ~/gnunet/src/dht;
$ ./gnunet-dht-monitor -c ~/peer1.conf -k KEY
-\end{lstlisting}
-Now open a separate terminal and change again to the
\lstinline|gnunet/src/dht| directory:
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden example
+Now open a separate terminal and change again to the gnunet/src/dht directory:
address@hidden
$ cd ~/gnunet/src/dht
$ ./gnunet-dht-put -c ~/peer1.conf -k KEY -d VALUE # put VALUE
under KEY in the DHT
$ ./gnunet/src/dht/gnunet-dht-get -c ~/peer1.conf -k KEY # get key KEY
from the DHT
$ gnunet-statistics -c ~/peer1.conf # print statistics about
current GNUnet state
$ gnunet-statistics -c ~/peer1.conf -s dht # print statistics about DHT
service
-\end{lstlisting}
-% $
address@hidden example
-\subsection{Starting Two Peers by Hand}
address@hidden Starting Two Peers by Hand}
This section describes how to start two peers on the same machine by hand.
The process is rather painful, but the description is somewhat instructive.
In practice, you might prefer the automated method described in
-Section~\ref{sec:testbed}.
+Section sec:testbed.
-\subsubsection{Setup a second peer}
address@hidden Setup a second peer
We will now start a second peer on your machine.
For the second peer, you will need to manually create a modified
configuration file to avoid conflicts with ports and directories.
-A peers configuration file is by default located in {\tt
~/.gnunet/gnunet.conf}.
+A peers configuration file is by default located in ~/.gnunet/gnunet.conf.
This file is typically very short or even empty as only the differences to the
defaults need to be specified. The defaults are located in
-many files in the {\tt \$PREFIX/share/gnunet/config.d} directory.
+many files in the $PREFIX/share/gnunet/config.d directory.
-To configure the second peer, use the files {\tt
- \$PREFIX/share/gnunet/config.d} as a template for your main
+To configure the second peer, use the files
+$PREFIX/share/gnunet/config.d as a template for your main
configuration file:
-%
-\lstset{language=bash}
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ cat $PREFIX/share/gnunet/config.d/*.conf > peer2.conf
-\end{lstlisting}
-Now you have to edit {\tt peer2.conf} and change:
address@hidden example
+Now you have to edit peer2.conf and change:
\begin{itemize}
\itemsep0em
\item{\texttt{GNUNET\_TEST\_HOME} under \texttt{PATHS}}
@@ -388,25 +350,23 @@ Now you have to edit {\tt peer2.conf} and change:
and the PORT option does not need to be touched) }
\item{Every value for ``\texttt{UNIXPATH}'' in any section (e.g. by adding a
"-p2" suffix)}
\end{itemize}
-to a fresh, unique value. Make sure that the \texttt{PORT} numbers stay
+to a fresh, unique value. Make sure that the PORT numbers stay
below 65536. From now on, whenever you interact with the second
-peer, you need to specify {\tt -c peer2.conf} as an additional
+peer, you need to specify -c peer2.conf as an additional
command line argument.
Now, generate the 2nd peer's private key:
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ gnunet-peerinfo -s -c peer2.conf
-\end{lstlisting}
-% $
address@hidden example
This may take a while, generate entropy using your keyboard or mouse
-as needed. Also, make sure the output is different from the {\tt
- gnunet-peerinfo} output for the first peer (otherwise you made an
+as needed. Also, make sure the output is different from the
+gnunet-peerinfo output for the first peer (otherwise you made an
error in the configuration).
-\subsubsection{Start the second peer and connect the peers}
address@hidden Start the second peer and connect the peers
Then, you can start a second peer using:
\lstset{language=bash}
@@ -433,11 +393,11 @@ OPTIONS = -p
Then change {\tt peer2.conf} and replace the ``\texttt{SERVERS}'' line in the
``\texttt{[hostlist]}'' section with
``\texttt{http://localhost:8080/}''. Restart both peers using:
-\begin{lstlisting}
address@hidden
$ gnunet-arm -c peer1.conf -e # stop first peer
$ gnunet-arm -c peer1.conf -s # start first peer
$ gnunet-arm -c peer2.conf -s # start second peer
-\end{lstlisting}
address@hidden example
Note that if you start your peers without changing these settings, they
will use the ``global'' hostlist servers of the GNUnet P2P network and
@@ -446,7 +406,7 @@ tricky as you're going to be connected to many more peers
and would
likely observe traffic and behaviors that are not explicitly controlled
by you.
-\subsubsection{How to connect manually}
address@hidden How to connect manually
If you want to use the \texttt{peerinfo} tool to connect your peers, you
should:
\begin{itemize}
@@ -459,13 +419,13 @@ If you want to use the \texttt{peerinfo} tool to connect
your peers, you should:
Check that they are connected using {\tt gnunet-core -c peer1.conf}, which
should give you the other peer's
peer identity:
-\lstset{language=bash}
-\begin{lstlisting}
address@hidden
$ gnunet-core -c peer1.conf
Peer `9TVUCS8P5A7ILLBGO6 [...shortened...] 1KNBJ4NGCHP3JPVULDG'
-\end{lstlisting}
address@hidden example
-\subsection{Starting Peers Using the Testbed Service} \label{sec:testbed}
address@hidden Starting Peers Using the Testbed Service
address@hidden \label{sec:testbed}
GNUnet's testbed service is used for testing scenarios where a number of peers
are to be started. The testbed can manage peers on a single host or on
multiple
@@ -494,7 +454,7 @@ With the testbed API, a sample test case can be structured
as follows:
\lstset{language=C}
\lstinputlisting{testbed_test.c}
The source code for the above listing can be found at
-\url{https://gnunet.org/git/gnunet.git/tree/doc/testbed_test.c}
address@hidden://gnunet.org/git/gnunet.git/tree/doc/testbed_test.c}
or in the {\tt doc/} folder of your repository check-out.
After installing GNUnet, the above source code can be compiled as:
\lstset{language=bash}
@@ -549,14 +509,14 @@ disconnect from the service with the provided service
handle (\texttt{op\_result
\exercise{Find out how many peers you can run on your system.}
\exercise{Find out how to create a 2D torus topology by changing the
- options in the configuration file.\footnote{See
\url{https://gnunet.org/supported-topologies}}
+ options in the configuration file.\footnote{See
@uref{https://gnunet.org/supported-topologies}}
Then use the DHT API to store and retrieve values in the
network.}
-\section{Developing Applications}
address@hidden Developing Applications
-\subsection{gnunet-ext}
address@hidden gnunet-ext}
To develop a new peer-to-peer application or to extend GNUnet we provide
a template build system for writing GNUnet extensions in C. It can be
obtained as follows:
@@ -603,7 +563,7 @@ In addition the \texttt{ext} systems provides:
\end{itemize}
-\subsection{Adapting the Template}
address@hidden Adapting the Template}
The first step for writing any extension with a new service is to
ensure that the {\tt ext.conf.in} file contains entries for the
@@ -614,7 +574,7 @@ If you want to adapt the template rename the {\tt
ext.conf.in} to match your
services name, you have to modify the \texttt{AC\_OUTPUT} section in {\tt
configure.ac}
in the \texttt{gnunet-ext} root.
-\section{Writing a Client Application}
address@hidden Writing a Client Application
When writing any client application (for example, a command-line
tool), the basic structure is to start with the {\tt
@@ -656,7 +616,7 @@ main (int argc, char *const *argv)
}
\end{lstlisting}
-\subsection{Handling command-line options}
address@hidden Handling command-line options}
Options can then be added easily by adding global variables and
expanding the {\tt options} array. For example, the following would
@@ -702,7 +662,7 @@ more persistent P2P functions.
\exercise{Add a few command-line options and print them inside
of {\tt run}. What happens if the user gives invalid arguments?}
-\subsection{Writing a Client Library}
address@hidden Writing a Client Library}
The first and most important step in writing a client library is to
decide on an API for the library. Typical API calls include
@@ -848,7 +808,7 @@ struct GNUNET_MQ_MessageHandler handlers[] = {
\exercise{Figure out where you can pass values to the closures ({\tt cls}).}
-\subsection{Writing a user interface}
address@hidden Writing a user interface}
Given a client library, all it takes to access a service now is to
combine calls to the client library with parsing command-line
@@ -861,13 +821,13 @@ options.
-\section{Writing a Service}
address@hidden Writing a Service
Before you can test the client you've written so far, you'll need to also
implement the corresponding service.
-\subsection{Code Placement}
address@hidden Code Placement}
New services are placed in their own subdirectory under {\tt gnunet/src}.
This subdirectory should contain the API implementation file {\tt
SERVICE\_api.c},
@@ -876,7 +836,7 @@ the description of the client-service protocol {\tt
SERVICE.h} and P2P protocol
{\tt gnunet-service-SERVICE.h} and several files for tests, including test code
and configuration files.
-\subsection{Starting a Service}
address@hidden Starting a Service}
The key API definition for creating a service is the {\tt
GNUNET\_SERVICE\_MAIN} macro:
\lstset{language=C}
@@ -949,7 +909,7 @@ from the same client.
forget to call {\tt GNUNET\_SERVICE\_client\_continue()}?}
-\section{Interacting directly with other Peers using the CORE Service}
address@hidden Interacting directly with other Peers using the CORE Service
FIXME: This section still needs to be updated to the lastest API!
@@ -972,7 +932,7 @@ GNUNET_CORE_connect (const struct
GNUNET_CONFIGURATION_Handle *cfg,
const struct GNUNET_MQ_MessageHandler *handlers);
\end{lstlisting}
-\subsection{New P2P connections}
address@hidden New P2P connections}
Before any traffic with a different peer can be exchanged, the peer must be
known to the service. This is notified by the \texttt{CORE} {\tt connects}
callback,
@@ -997,7 +957,7 @@ the respective peer.
start (and connect) two peers and print a message once your connect
callback is invoked.}
-\subsection{Receiving P2P Messages}
address@hidden Receiving P2P Messages}
To receive messages from \texttt{CORE}, you pass the desired
{\em handlers} to the {\tt GNUNET\_CORE\_connect()} function,
@@ -1014,7 +974,7 @@ without message handlers. Which ``connect'' handlers are
invoked when
the two peers are connected? Why?}
-\subsection{Sending P2P Messages}
address@hidden Sending P2P Messages}
You can transmit messages to other peers using the {\it mq} you were
given during the {\tt connect} callback. Note that the {\it mq}
@@ -1032,7 +992,7 @@ messages lost? How can you transmit messages faster? What
happens if
you stop the peer that is receiving your messages?}
-\subsection{End of P2P connections}
address@hidden End of P2P connections}
If a message handler returns {\tt GNUNET\_SYSERR}, the remote peer shuts down
or
there is an unrecoverable network disconnection, CORE notifies the service that
@@ -1053,7 +1013,7 @@ disconnects (void *cls,
\exercise{Fix your service to handle peer disconnects.}
-\section{Storing peer-specific data using the PEERSTORE service}
address@hidden Storing peer-specific data using the PEERSTORE service
GNUnet's PEERSTORE service offers a persistorage for arbitrary peer-specific
data.
Other GNUnet services can use the PEERSTORE to store, retrieve and monitor
data records.
@@ -1077,7 +1037,7 @@ peerstore_handle = GNUNET_PEERSTORE_connect (cfg);
The service handle \lstinline|peerstore_handle| will be needed for all
subsequent
PEERSTORE operations.
-\subsection{Storing records}
address@hidden Storing records}
To store a new record, use the following function:
\begin{lstlisting}
@@ -1110,7 +1070,7 @@ void
GNUNET_PEERSTORE_store_cancel (struct GNUNET_PEERSTORE_StoreContext *sc);
\end{lstlisting}
-\subsection{Retrieving records}
address@hidden Retrieving records}
To retrieve stored records, use the following function:
\begin{lstlisting}
@@ -1140,7 +1100,7 @@ The \lstinline|GNUNET_PEERSTORE_iterate| function returns
a handle to the iterat
handle can be used to cancel the iterate operation only before the callback
function is called with
a \lstinline|NULL| record.
-\subsection{Monitoring records}
address@hidden Monitoring records}
PEERSTORE offers the functionality of monitoring for new records stored under
a specific key
combination (subsystem, peerid, key). To start the monitoring, use the
following function:
@@ -1162,7 +1122,7 @@ void
GNUNET_PEERSTORE_watch_cancel (struct GNUNET_PEERSTORE_WatchContext *wc);
\end{lstlisting}
-\subsection{Disconnecting from PEERSTORE}
address@hidden Disconnecting from PEERSTORE}
When the connection to the PEERSTORE service is no longer needed, disconnect
using the following
function:
@@ -1176,7 +1136,7 @@ disconnection until all store requests are received by
the PEERSTORE service. Ot
it will disconnect immediately.
-\section{Using the DHT}
address@hidden Using the DHT
The DHT allows to store data so other peers in the P2P network can
access it and retrieve data stored by any peers in the network.
@@ -1190,7 +1150,7 @@ The second parameter indicates how many requests in
parallel to expect.
It is not a hard limit, but a good approximation will make the DHT more
efficient.
-\subsection{Storing data in the DHT}
address@hidden Storing data in the DHT}
Since the DHT is a dynamic environment (peers join and leave frequently)
the data that we put in the DHT does not stay there indefinitely. It is
important to ``refresh'' the data periodically by simply storing it again,
@@ -1229,7 +1189,7 @@ over time. You might consider using the function
GNUNET\_SCHEDULER\_add\_delayed
call GNUNET\_DHT\_put from inside a helper function.}
-\subsection{Obtaining data from the DHT}
address@hidden Obtaining data from the DHT}
As we saw in the previous example, the DHT works in an asynchronous mode.
Each request to the DHT is executed ``in the background'' and the API
calls return immediately. In order to receive results from the DHT, the
@@ -1273,7 +1233,7 @@ get_handle =
the peers the requests have gone through. In order to convert a peer ID to a
string, use
the function GNUNET\_i2s. Pay attention to the route option parameters in both
calls!}
-\subsection{Implementing a block plugin}
address@hidden Implementing a block plugin}
In order to store data in the DHT, it is necessary to provide a block
plugin. The DHT uses the block plugin to ensure that only well-formed
@@ -1417,7 +1377,7 @@ when the respective validation hooks are called.}
-\subsection{Monitoring the DHT}
address@hidden Monitoring the DHT
It is possible to monitor the functioning of the local DHT service. When
monitoring
the DHT, the service will alert the monitoring program of any events,
both started locally or received for routing from another peer. The are three
different
@@ -1484,7 +1444,7 @@ monitor_handle = GNUNET_DHT_monitor_start (dht_handle,
\end{lstlisting}
-\section{Debugging with {\tt gnunet-arm}}
address@hidden Debugging with gnunet-arm
Even if services are managed by {\tt gnunet-arm}, you can start them with
{\tt gdb} or {\tt valgrind}. For example, you could add the following lines
@@ -1514,7 +1474,7 @@ GNUnet provides a powerful logging mechanism providing
log levels \texttt{ERROR}
configured using the \lstinline|$GNUNET_FORCE_LOG| environmental variable.
The \texttt{DEBUG} level is only available if
\lstinline|--enable-logging=verbose| was used when
running \texttt{configure}. More details about logging can be found under
-\url{https://gnunet.org/logging}.
address@hidden://gnunet.org/logging}.
You should also probably enable the creation of core files, by setting
{\tt ulimit}, and echo'ing 1 into {\tt /proc/sys/kernel/core\_uses\_pid}.
--
To stop receiving notification emails like this one, please contact
address@hidden
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] [gnunet] branch master updated: doc: Start of half-manual conversion from LaTeX to Texinfo for gnunet-c-tutorial.,
gnunet <=