uni

University stuff
git clone git://git.margiolis.net/uni.git
Log | Files | Refs | README | LICENSE

doc.tex (8219B)


      1 \documentclass{article}
      2 \usepackage[utf8]{inputenc}
      3 \usepackage[greek,english]{babel}
      4 \usepackage{alphabeta}
      5 \usepackage{fancyhdr}
      6 \usepackage{listings}
      7 \usepackage{mathtools}
      8 \usepackage{xcolor}
      9 \usepackage{biblatex}
     10 \usepackage[left=2cm,right=2cm]{geometry}
     11 
     12 \lstset {
     13         basicstyle=\ttfamily,
     14         columns=fullflexible,
     15         breaklines=true,
     16         keepspaces=true,
     17 	showstringspaces=false
     18 }
     19 
     20 \title{Εργαστήριο Κατανεμημένων Συστημάτων - Εργασία 1}
     21 \author{Χρήστος Μαργιώλης}
     22 \date{Μάιος 2022}
     23 
     24 \begin{document}
     25 
     26 \begin{titlepage}
     27         \maketitle
     28         \begin{figure}[t!]
     29         \begin{center}
     30         \includegraphics[scale=0.3]{./res/uniwalogo.png} \\
     31         \Large
     32         \textbf{Πανεπιστήμιο Δυτικής Αττικής} \\
     33         \large
     34         Τμήμα Μηχανικών Πληροφορικής και Ηλεκτρονικών Υπολογιστών
     35         \end{center}
     36         \end{figure}
     37 \end{titlepage}
     38 
     39 \renewcommand{\contentsname}{Περιεχόμενα}
     40 \tableofcontents
     41 
     42 \section{Χρήση \lstinline{rpcgen}}
     43 
     44 Πριν γίνει η ανάπτυξη του client/server κώδικα, πρέπει να παραχθούν τα
     45 απαραίτητα RPC αρχεία. Στο αρχείο \lstinline{rpc.x} δηλώνονται οι τα ονόματα
     46 και οι δομές των Remote Procedure Calls.
     47 
     48 Παράγουμε τα client και server stubs (αρχεία στα οποία θα συμπληρωθεί ο
     49 κώδικας), καθώς και το \lstinline{Makefile} για να είναι πιο εύκολη η
     50 μεταγλώττιση:
     51 
     52 \begin{lstlisting}
     53 	$ rpcgen -Ss -C > rpc_server.c
     54 	$ rpcgen -Sc -C > rpc_client.c
     55 	$ rpcgen -Sm > Makefile.rpc
     56 \end{lstlisting}
     57 
     58 Στο \lstinline{Makefile.rpc} κάνουμε μερικές αλλαγές ωστέ ο server να μην
     59 τρέχει στο background, και στην μεταγλώττιση να περιέχονται τα
     60 \lstinline{rpc_client.c} και \lstinline{rpc_server.c}:
     61 
     62 \begin{lstlisting}[language=make]
     63 	...
     64 	TARGETS_SVC.c = rpc_server.c rpc_svc.c rpc_xdr.c
     65 	TARGETS_CLNT.c = rpc_client.c rpc_clnt.c rpc_xdr.c
     66 	...
     67 	CFLAGS += -g -DRPC_SVC_FG
     68 	RPCGENFLAGS = -C
     69 \end{lstlisting}
     70 
     71 \section{Εκτέλεση κώδικα}
     72 
     73 Το αρχείο \lstinline{sock_client.c} υλοποιεί τον client τον οποίο εκτελεί ο
     74 χρήστης. Το \lstinline{rpc_client.c}, παρόλο που λέει "client", είναι ο server
     75 με τον οποίο επικοινωνεί ο \lstinline{sock_client.c} και κάνει τις remote
     76 κλήσεις στον \lstinline{rpc_server.c}, ο οποίος υλοποιεί τις συναρτήσεις των
     77 RPC.
     78 
     79 Κάνουμε compile τους κώδικες:
     80 
     81 \begin{lstlisting}
     82 	$ make
     83 	make -f Makefile.rpc
     84 	rpcgen -C rpc.x
     85 	cc  -O2 -pipe -g -DRPC_SVC_FG -c rpc_client.c -o rpc_client.o
     86 	cc  -O2 -pipe -g -DRPC_SVC_FG -c rpc_clnt.c -o rpc_clnt.o
     87 	cc  -O2 -pipe -g -DRPC_SVC_FG -c rpc_xdr.c -o rpc_xdr.o
     88 	cc -o rpc_client  rpc_client.o rpc_clnt.o rpc_xdr.o  -O2 -pipe -g -DRPC_SVC_FG
     89 	cc  -O2 -pipe -g -DRPC_SVC_FG -c rpc_server.c -o rpc_server.o
     90 	cc  -O2 -pipe -g -DRPC_SVC_FG -c rpc_svc.c -o rpc_svc.o
     91 	cc -o rpc_server  rpc_server.o rpc_svc.o rpc_xdr.o  -O2 -pipe -g -DRPC_SVC_FG
     92 	cc sock_client.c -o sock_client
     93 \end{lstlisting}
     94 
     95 Τα τρία προγράμματα εκτελούνται ως εξής:
     96 \begin{itemize}
     97 	\item \lstinline{./rpc_server}
     98 	\item \lstinline{./rpc_client [-b backlog] [-p port] hostname}
     99 	\item \lstinline{./sock_client [-p port] hostname}
    100 \end{itemize}
    101 
    102 Πριν τρέξουμε οποιοδήποτε RPC πρόγραμμα, πρέπει να αρχίσουμε το
    103 \lstinline{rpcbind(8)} service (για FreeBSD):
    104 
    105 \begin{lstlisting}
    106 	# service rpcbind start
    107 \end{lstlisting}
    108 
    109 Αφού τρέξουμε τον server, μπορούμε να δούμε ότι τα Remote Procedure Calls
    110 έχουνε εισαχθεί στον πίνακα RPC. Η εντολή \lstinline{rpcinfo(8)} τυπώνει
    111 τον πίνακα:
    112 
    113 \begin{lstlisting}
    114 	$ ./rpc_server
    115 	$ rpcinfo
    116 	   program version netid     address                service    owner
    117 	    100000    4    tcp       0.0.0.0.0.111          rpcbind    superuser
    118 	    100000    3    tcp       0.0.0.0.0.111          rpcbind    superuser
    119 	    100000    2    tcp       0.0.0.0.0.111          rpcbind    superuser
    120 	    100000    4    udp       0.0.0.0.0.111          rpcbind    superuser
    121 	    100000    3    udp       0.0.0.0.0.111          rpcbind    superuser
    122 	    100000    2    udp       0.0.0.0.0.111          rpcbind    superuser
    123 	    100000    4    tcp6      ::.0.111               rpcbind    superuser
    124 	    100000    3    tcp6      ::.0.111               rpcbind    superuser
    125 	    100000    4    udp6      ::.0.111               rpcbind    superuser
    126 	    100000    3    udp6      ::.0.111               rpcbind    superuser
    127 	    100000    4    local     /var/run/rpcbind.sock  rpcbind    superuser
    128 	    100000    3    local     /var/run/rpcbind.sock  rpcbind    superuser
    129 	    100000    2    local     /var/run/rpcbind.sock  rpcbind    superuser
    130 	 536870912    1    udp6      ::.161.100             -          1001
    131 	 536870912    1    tcp6      ::.93.202              -          1001
    132 	 536870912    1    udp       0.0.0.0.44.39          -          1001
    133 	 536870912    1    tcp       0.0.0.0.219.61         -          1001
    134 	 536870913    1    udp6      ::.161.100             -          1001
    135 	 536870913    1    tcp6      ::.93.202              -          1001
    136 	 536870913    1    udp       0.0.0.0.44.39          -          1001
    137 	 536870913    1    tcp       0.0.0.0.219.61         -          1001
    138 	 536870914    1    udp6      ::.161.100             -          1001
    139 	 536870914    1    tcp6      ::.93.202              -          1001
    140 	 536870914    1    udp       0.0.0.0.44.39          -          1001
    141 	 536870914    1    tcp       0.0.0.0.219.61         -          1001
    142 \end{lstlisting}
    143 
    144 Οι γραμμές που ξεκινούν με 53687* είναι τα RPC που δημιούργησε ο
    145 \lstinline{rpc_server}.
    146 
    147 \section{Ενδεικτικά τρεξίματα}
    148 
    149 Σε κάθε ενότητα έχω παραθέσει τα output των 3 προγραμμάτων στην τελική τους
    150 κατάσταση. 'Ισως χρειαστεί λίγη μεγέθυνση...
    151 
    152 \subsection{Server και client στον ίδιο υπολογιστή}
    153 
    154 \includegraphics[width=\linewidth]{res/samepc.png}
    155 
    156 \subsection{Server και client σε διαφορετικές IP}
    157 
    158 Ο RPC server τώρα τρέχει σε FreeBSD Jail, το οποίο, αν και βρίσκεται στο ίδιο
    159 τοπικό δίκτυο, έχει διαφορετική IP διεύθυνση. Ο RPC client και ο socket client
    160 τρέχουν ακόμα στο τρέχουν ακόμα στον localhost. \\
    161 
    162 \includegraphics[width=\linewidth]{res/jail.png}
    163 
    164 \subsection{Δοκιμή concurrency}
    165 
    166 Ο RPC server και client τρέχουν και οι δύο σε FreeBSD Jail, και αυτή τη φορά θα
    167 δοκιμάσουμε να ελέγξουμε αν ο server είναι όντως concurrent.
    168 
    169 \includegraphics[width=\linewidth]{res/concur.png}
    170 
    171 \section{Κώδικας}
    172 
    173 Ο κώδικας είναι σχολιασμένος στα σημεία που θεωρώ ότι μπορεί να υπάρξει
    174 σύχγηση, και όχι ακόμα και σε σημεία που είναι λίγο-πολύ ξεκάθαρο το τι
    175 συμβαίνει.
    176 
    177 \subsection{\lstinline{rpc.x}}
    178 
    179 \lstinputlisting{../src/rpc.x}
    180 \pagebreak
    181 
    182 \subsection{\lstinline{rpc_server.c}}
    183 
    184 \lstinputlisting[language=C]{../src/rpc_server.c}
    185 \pagebreak
    186 
    187 \subsection{\lstinline{rpc_client.c}}
    188 
    189 \lstinputlisting[language=C]{../src/rpc_client.c}
    190 \pagebreak
    191 
    192 \subsection{\lstinline{sock_client.c}}
    193 
    194 \lstinputlisting[language=C]{../src/sock_client.c}
    195 \pagebreak
    196 
    197 \subsection{\lstinline{Makefile.rpc}}
    198 
    199 \lstinputlisting[language=make]{../src/Makefile.rpc}
    200 \pagebreak
    201 
    202 \subsection{\lstinline{Makefile}}
    203 
    204 \lstinputlisting[language=make]{../src/Makefile}
    205 \pagebreak
    206 
    207 \end{document}