doc.tex (8226B)
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{Χρήστος Μαργιώλης -- 19390133} 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}