Post on 13-Oct-2020
transcript
1‐03‐2010
1
Laboratorio di reti Associato al corso teorico di Reti di Calcolatori
tenuto dal Prof. Roberto De Prisco
AnnoAccademico2009‐2010Introduzione
Informazioni
• Docente:PaoloD’Arco– Ufficion.45,quartopiano,stecca7– hGp://www.dia.unisa.it/professori/paodar/
• Giorno,Orarioeluogodellelezioni– Giovedi,dalle9:00alle12:00,Lab.P13
• Corsopermatricolecongruea0
• Materialedelcorso– hGp://www.dia.unisa.it/professori/paodar/labreR2010.html
1‐03‐2010
2
Modalitàd’esame
• ProvapraRcainlaboratorio– Implementazionediunapiccolaapplicazioneclient‐server
• Il superamento della prova è condizionenecessaria al superamento dell’esame di ReRdicalcolatori– Provasuperatavalidaperunanno
ContenuRdelcorso
1‐03‐2010
3
ObieVvo
• Imparareascriveresempliciprogrammiperlacomunicazionesuunaretedicalcolatori
• Assunzione– Sapetegiàprogrammare,avetefamiliaritàconunSO…
• Ambientedisviluppo– Linux– CompilatoreC– SocketAPI
Comandi
Useremoterminalitestuali
Nonuseremoildesktopgrafico
1‐03‐2010
4
TerminaleTestuale
• Terminaletestuale– Lineedicomando– Prompt
• Comandi– ls,cd,pwd,cp,rm,mv,cat,mkdir– man<comando>
macbook‐di‐paolo‐darco:~pd>cdCorsi/ReR/Lab2009/CODLEZ/macbook‐di‐paolo‐darco:CODLEZpd>
Interpretedeicomandi
• Shell– Èilprogrammacheinterpretaicomandi
• BASH– ÈlashellstandarddiLinux– Echo$SHELL
macbook‐di‐paolo‐darco:~pd>echo$SHELL/bin/bashmacbook‐di‐paolo‐darco:~pd>
1‐03‐2010
5
EdiRng
• Editordifile– vi– emacs
• Occorreimparareadusareuneditor– Bastailminimoindispensabile
• Manuali– UnaricercasuInternetvifornirànumerosefonR– “manualeeditorvi”
CodiceC#include <stdio.h>
int main(int argc, char **argv) { union { short s; char c[sizeof(short)]; } un;
un.s = 0x0102; printf("CPU = %s - byte ordering: ",getenv("CPU"));
if (sizeof(short) == 2) { if ( un.c[0] == 1 && un.c[1] == 2 ) printf ("big-endian\n"); else if ( un.c[0] == 2 && un.c[1] == 1 ) printf ("little-endian\n"); else printf("unknown\n"); } else printf("size of short: %d.\n",sizeof(short));
exit(0); }
1‐03‐2010
6
Compilareunprogrammasignifica1. trasformareilsorgenteCincodiceoggeGo2. collegaretalecodiceoggeGoconlelibrerie(link)
• gcc(GNUCCompiler)• gccprog.c (outputina.out)• gcc–oprogprog.c(outputinprog)• gcc‐g‐O0‐Werror –O–DDEBUG...(opzionivarie)
Compilazione
FilemulRplielibrerie
• UnprogrammapuòavereunastruGuracomplessa• main.c• invocafunzionidilibreriadelsistemaoperaRvo(e.g.,prin4)• invocafunzionidefinitedall’utenteememorizzateinfunc1.c,func2.c,func3.cefunc4.c• protoRpiin“myfunc.h”
• Occorreincludereall’iniziodelmain.c
#include<stdio.h> (/usr/include//usr/lib/include/) #include"myfunc.h” (directorylocale)
affinchèilcompilatoretroviiprotoRpidellefunzioniinvocate
1‐03‐2010
7
• illinkerrecuperaautomaRcamenteilcodiceoggeGodellefunzionidilibreriadelsistemanelledirectory
/usr/libe/usr/local/lib
• l’utentepuòcompilareseparatamentelesuefunzioni,e.g.,
gcc‐cfunc1.ofunc1.c (creailfileoggeGofunc1.o)
• compilaremain.cpassandoalcompilatoreimoduliogge=oconlepropriefunzioni
gccmain.c‐omainfunc1.ofunc2.ofunc3.ofunc4.o
• addiriGural’utentepotrebbecreareproprielibreriedifunzioni,usandocomandidelSO(e.g.,ar)perraccoglierediversimodulioggeGo,efornirealcompilatoreladirectorycheconRenelalibreria
gcc‐omainmain.c‐LMylibdir
Conclusione:ilprocessodicompilazionepuòdiventarecomplesso,tediosoefacilmentesogge=o
aderrori!Vogliamounavitapiùsemplice!
1‐03‐2010
8
Comandomake
Idea: Raccogliamo le direVve di compilazione in un unico file, denominatoMakefileomakefile,einvochiamounnuovocomando,make,cheleggeilfilee, a sua volta, invoca il compilatore gcc esaGamente quanto serve e con leopzionigiuste.
Grafodelledipendenze
Makefile
• Codificailgrafodelledipendenze
a.out:file1.ofile2.o gccfile1.ofile2.o
file1.o:file.hfile1.c gcc‐cfile1.c
file2.o:file.hfile2.c gcc‐cfile2.c
target:sourcefile(s) command (dopounTAB)
Sintassicomandi
Ognivoltacheunsourcefilehaunadatadimodificapiùrecentediquelladeltargetfile,iltargetfilevieneaggiornatoeseguendoilcomandospecificato
1‐03‐2010
9
NostroMakefile#Makefile
CFLAGS=‐g‐O0‐Werror‐cOFLAGS=‐g‐O0‐Werror–o
fun‐corso‐reR.o:fun‐corso‐reR.cgcc$(CFLAGS)fun‐corso‐reR.c
.c:fun‐corso‐reR.o@echocompiling$<withrule1gcc$<$(OFLAGS)$@fun‐corso‐reR.o
clean:rm‐f*~rm‐f*.o
macbook‐di‐paolo‐darco:CODLEZpd$lsMakefile byteorder.c fun‐corso‐reR.cbasic.h byteorder.dSYMmacbook‐di‐paolo‐darco:CODLEZpd$makegcc‐g‐O0‐Werror‐cfun‐corso‐reR.cmacbook‐di‐paolo‐darco:CODLEZpd$makebyteordercompilingbyteorder.cwithrule1gccbyteorder.c‐g‐O0‐Werror‐obyteorderfun‐corso‐reR.omacbook‐di‐paolo‐darco:CODLEZpd$lsMakefile byteorder.c fun‐corso‐reR.obasic.h byteorder.dSYMbyteorder fun‐corso‐reR.cmacbook‐di‐paolo‐darco:CODLEZpd$makecleanrm‐f*~rm‐f*.omacbook‐di‐paolo‐darco:CODLEZpd$lsMakefile byteorder byteorder.dSYMbasic.h byteorder.c fun‐corso‐reR.cmacbook‐di‐paolo‐darco:CODLEZpd$
Esempiod’uso
1‐03‐2010
10
Insintesi
• Useremoilcomandomakepercompilare
• Useremounfile,fun‐corso‐reH.c,checonRenefunzioniuRli
• Useremounfile,basic.h,cheraccogliereheaderfileemacro
• Ifile:Makefile,fun‐corso‐reR.cebasic.hlitrovatesullapaginadelcorso
fun‐corso‐reR.c
• DefiniscevariefunzioniperlaleGuraescriGuradeisocket
• Convenzionesulnome– reR_nomefunzione
• Funzionidisponibili– reH_readn
• LeggeesaGamentenbyte– reH_writen
• ScriveesaGamentenbyte– reH_readline
• Leggeunariga(cheterminacon\n)
• DeGaglinelfilefun‐corso‐reR.c
1‐03‐2010
11
#ifndef __BASIC__ #define __BASIC__ #include <sys/types.h> /* basic system data types */ #include <sys/socket.h> /* basic socket definitions */ #include <sys/time.h> /* timeval{} for select() */ #include <time.h> /* timespec{} for pselect() */ #include <netinet/in.h> /* sockaddr_in{} and other Internet defns */ #include <arpa/inet.h> /* inet(3) functions */ #include <errno.h> …… #include <unistd.h> #include <sys/wait.h> #include <sys/un.h> /* for Unix domain sockets */
#define MAXLINE 256 #define PORT 12345 #define BACKLOG 5 #define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif
basic.h
RappresentazionedeidaR
LearchiteGuredeicalcolatorimemorizzanoidaRinmodidiversi:
• liGle‐endian:memorizzanoilbytemenosignifica6vo(LSB)nelprimobytedellalocazionedimemoria.
• big‐endian::memorizzanoilbytepiùsignifica6vo(MSB)nelprimobytedellalocazionedimemoria
Esempio.Parolamacchinadi16bitValoredecimale258Rapp.esadecimale:0x0102
1‐03‐2010
12
Comunicazione
E’ come se nelle architeGure liGle‐endian i daR venissero interpretaRleggendodadestraa sinistra,mentre inquellebig‐endianda sinistraadestra.
Se due programmi, il primo in esecuzione su un calcolatore A conarchiteGura liGle‐endian e il secondo in esecuzione su un calcolatore BconarchiteGurabig‐endian,interpretanoidaRchesiscambianoinmododiverso, le computazioni risultanR sono inconsistenR (e.g, 513 invecedi258).
Curiosità• ScriGuredipopolianRchiedipopoliorientali• Altoversoilbasso,destraversosinistra• ScriGurabustrofedica
SeppurconoscessimoglialfabeRdialtrelingue,diversidainostri,leggendonelnostroversononriusciremmoadinterpretarecorreGamenteciòchec’èscriGo.TuGosommato,ilmondodeicomputerdigitalièmoltopiùsemplice:l’alfabetoèunico(binario)eledirezionisonosoltantodue!
1‐03‐2010
13
DicheRpoèlanostraarchiteGura?#include <stdio.h>
int main(int argc, char **argv) { union { short s; char c[sizeof(short)]; } un;
un.s = 0x0102; printf("CPU = %s - byte ordering: ",getenv("CPU"));
if (sizeof(short) == 2) { if ( un.c[0] == 1 && un.c[1] == 2 ) printf ("big-endian\n"); else if ( un.c[0] == 2 && un.c[1] == 1 ) printf ("little-endian\n"); else printf("unknown\n"); } else printf("size of short: %d.\n",sizeof(short)); exit(0); }
Conclusioni
• Allafinedelcorsosapremoscrivereprogrammichecomunicanosurete
• IlnostroambientedilavoroèfaGoditerminalitestuali,shell,ededitorditesto
• URlizzeremoilcomandomakepercompilareealcunifiledisupporto,scaricabilidalsitodelcorso
• NellascriGuradiprogrammifaremosempreaGenzionealproblemadellarappresentazionedeidaRindiversearchiteGure.