Forum Informatica Unict

Vecchi ordinamenti ad esaurimento => Sistemi Distribuiti 1 => Topic started by: Nova on 22-02-2010, 10:58:39



Title: compito di laboratorio
Post by: Nova on 22-02-2010, 10:58:39
Ragazzi io mi starei preparando per il secondo appello di laboratorio. Vorrei sapere che cosa viene chiesto nei compiti di laboratorio in modo da esercitarmi come si deve.

Grazie


Title: Re:compito di laboratorio
Post by: Liuba on 25-02-2010, 13:53:04
...mi accodo alla richiesta  .arrossisco grazie!


Title: Re:compito di laboratorio
Post by: shiny on 25-02-2010, 16:50:26
il compito del primo appello era suddiviso in 2 parti (da fare entrambe in 1 ora e 15) di cui la prima parte chiedeva di implementare una funzione hash remota usando rmi o rpc, la seconda parte chiedeva di collegarsi ad un server http, scaricare un file, leggerne la 12-esima riga, estrarre il numero contenuto in questa riga, invocare la funzione hash della prima parte, passandogli la riga e sommare (o moltiplicare) il numero ottenuto dalla funzione hash al numero salvato in precedenza e darlo in output... questo e' a grandi linee il compito dato quindi bisogna studiare praticamente tutto ^^


Title: Re:compito di laboratorio
Post by: Liuba on 25-02-2010, 17:24:32
 .smile grazie shiny!


Title: Re:compito di laboratorio
Post by: Nova on 25-02-2010, 21:41:06
perfetto grazie mille!  .wink

Adesso avrei due domande:

La rpc la hai implementata in java o in C? (nel caso del C posteresti il codice?)

Purtroppo le rpc al momento mi terrorizzano, non ho ancora ben capito come implementarle e dato che ho studiato tutto in C vorrei farle in C. Qualche aiuto?

Grazie mille


Title: Re:compito di laboratorio
Post by: shiny on 26-02-2010, 00:30:51
io personalmente ho fatto tutto in C visto che il java lo considero troppo verboso... appena ho un po' ti tempo posto il codice di esempio del client e del server... adesso ho troppo sonno per farlo  :pray ciao ciao


Title: Re:compito di laboratorio
Post by: Nova on 26-02-2010, 10:28:02
Grazie mille!!! E l'RPC come l'hai fatta? Hai scritto prima il file .x e poi rpcgen -a?

Porca miseria non riesco a fare funzionare l'rpc :(

Ho scritto un server che definisce una rpc ed un client che non riesce ad usarla. Mi fareste vedere un esempio?


Title: Re:compito di laboratorio
Post by: shiny on 27-02-2010, 13:04:02
come promesso eccovi il codice del file .x

Code:
program HASHFUNC {
version HASHFUNC_V {
int hash(string) = 0;
} = 0;
} = 0x01;

quello del client
Code:
#include "hashFunc.h"


void hashfunc_0(char *host, char *string) {
CLIENT *clnt;
int  *result;

clnt = clnt_create (host, HASHFUNC, HASHFUNC_V, "udp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}

result = hash_0(&string, clnt);
if (result == (int *) NULL) {
clnt_perror (clnt, "call failed");
}
printf("Il codice hash e' %d", *result);

clnt_destroy (clnt);
}


int main (int argc, char *argv[]) {
char *host, *string;

if (argc < 3) {
printf ("usage: %s server_host string\n", argv[0]);
exit (1);
}

host = argv[1];
string = argv[2];
hashfunc_0 (host, string);
exit (0);
}
e quello del server
Code:
#include <string.h>
#include "hashFunc.h"

int* hash_0_svc(char **argp, struct svc_req *rqstp) {
static int  result;
int somma, i;

for(i=0, somma=0; i<strlen(*argp); i++)
somma += *(*argp+1);

result = somma % 26;
return &result;
}

a questo link (http://galileo.dmi.unict.it/utenti/shiny/DOWNLOADS/hashf.tar.gz) potete scaricare l'esempio gia' compilato e funzionante...
se non funziona magari dovete installare portmap (da repository per chi usa ubuntu).

Buono studio a tutti .wink.


Title: Re:compito di laboratorio
Post by: Nova on 28-02-2010, 16:28:18
Nel file .x non dovresti mettere

int func(par) = 0;

La fuinzione 0 è riservata e non dovrebbe essere ridefinita.
Grazie mille per il codice ;)


Title: Re:compito di laboratorio
Post by: shiny on 01-03-2010, 11:18:05
io ti posso dire che a me funziona benissimo anche se metto 0... cmq se e' riservata metti 1 ^^


Title: Re:compito di laboratorio
Post by: Nova on 01-03-2010, 18:59:01
si, funziona, ma sarebbe riservata, tutto qua :p


Title: Re:compito di laboratorio
Post by: alex180788 on 24-09-2010, 22:02:22

il compito del primo appello era suddiviso in 2 parti (da fare entrambe in 1 ora e 15) di cui la prima parte chiedeva di implementare una funzione hash remota usando rmi o rpc, la seconda parte chiedeva di...
... collegarsi ad un server http, scaricare un file, leggerne la 12-esima riga, estrarre il numero contenuto in questa riga, invocare la funzione hash della prima parte, passandogli la riga e sommare (o moltiplicare) il numero ottenuto dalla funzione hash al numero salvato in precedenza e darlo in output...

ma questa parte (che sarebbe praticamente tutto l'esercizio) dove è implementata???


Title: Re:compito di laboratorio
Post by: shiny on 26-09-2010, 00:27:53
ma questa parte (che sarebbe praticamente tutto l'esercizio) dove è implementata???

perche' non la scrivi te e non la posti? Io personalmente non l'ho fatta in quanto come puoi vedere dal post sotto citato non mi era stato chiesto. inoltre non credo sia la parte + difficile quella mancante perche' in lab ci avro' messo 10 mins a farla... si tratta giusto di aprire una socket e scaricarti un file. 

Grazie mille!!! E l'RPC come l'hai fatta? Hai scritto prima il file .x e poi rpcgen -a?

Porca miseria non riesco a fare funzionare l'rpc :(

Ho scritto un server che definisce una rpc ed un client che non riesce ad usarla. Mi fareste vedere un esempio?




Title: Re:compito di laboratorio
Post by: alex180788 on 27-09-2010, 08:57:10

si scusami non avevo letto bene il post  .arrossisco

ti volevo chiedere come si fa questa parte?? .... cioè se ho un file, individuare le righe non credo sia una cosa complicata anche perchè probabilmente ci saranno delle funzioni già pronte per questo in alternativa basterebbe contare i caratteri '\n'... almeno io lo farei cosi ma se sto dicendo qualche boiata correggimi subito per favore

ma quello che non riesco a capire è come scaricare il file (sia lato client che server)... nella chiamata remota dichiarata nel file .x dovrei mettere come tipo di valore restituito FILE * ??  ma nel server come faccio ad inviare un file??.... se fosse locale il server potrebbe semplicemente restituire il puntatore al file ma il server è remoto ed il file va scaricato quindi dal server dovrei ottenere una copia del file da mettere nel client??? non riesco a capire come si fa questa parte potresti spiegarmelo? o almeno segnalarmi qualche esempio perchè in quelli del prof non ce ne sono





Title: Re:compito di laboratorio
Post by: shiny on 27-09-2010, 18:23:57

si scusami non avevo letto bene il post  .arrossisco

ti volevo chiedere come si fa questa parte?? .... cioè se ho un file, individuare le righe non credo sia una cosa complicata anche perchè probabilmente ci saranno delle funzioni già pronte per questo in alternativa basterebbe contare i caratteri '\n'... almeno io lo farei cosi ma se sto dicendo qualche boiata correggimi subito per favore

ma quello che non riesco a capire è come scaricare il file (sia lato client che server)... nella chiamata remota dichiarata nel file .x dovrei mettere come tipo di valore restituito FILE * ??  ma nel server come faccio ad inviare un file??.... se fosse locale il server potrebbe semplicemente restituire il puntatore al file ma il server è remoto ed il file va scaricato quindi dal server dovrei ottenere una copia del file da mettere nel client??? non riesco a capire come si fa questa parte potresti spiegarmelo? o almeno segnalarmi qualche esempio perchè in quelli del prof non ce ne sono

Vorrei puntualizzare delle cose:
  • In questo compito il metodo remoto faceva la semplice computazione che puoi vedere sopra... non doveva scaricare niente.
  • Il file punto .x non si scrive in linguaggio C quindi la struttura FILE non esiste... se non ricordo male il prof ha spiegato che si devono serializzare le strutture e farne il marshalling (non ricordo se si scrive cosi' ^^). To consiglio di dare un occhiata alla documentazione ufficiale
  • Quando dicevo di scaricare un file intendevo aprire uno stream col server che restituisce dei byte...

Fatte queste premesse lo stream di byte proveniente dalla connessione col server lo puoi memorizzare in una variabile o in un file... una volta chiusa la connessione puoi usare le funzioni sulle stringhe o sui files per trovare la riga che ti serve... credo sia una cosa abbastanza banale visti i molteplici esempi che il prof mette a disposizione sul suo sito  .wink


Title: Re:compito di laboratorio
Post by: alex180788 on 30-09-2010, 08:18:32
saltando la parte dei vari #include questo è il client:

Code:
#define MAXBUF 1024
#define SERVERPORT 3002
#define SERVERNAME "localhost"

char buffer[MAXBUF];
char bufferAppoggio[MAXBUF];

int main (int argc, char* argv[])
{
int retcode, msg_len;
int client_socket;
struct sockaddr_in server_addr;
char *msg;
//creazione socket locale
client_socket=socket(AF_INET,SOCK_STREAM,0);
if(client_socket==-1)
{
perror("Errore nella creazione della socket");
exit(-1);
}

//preparazione dell'indirizzo
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(SERVERPORT);
   memcpy(&server_addr.sin_addr,
           gethostbyname(SERVERNAME)->h_addr,
           sizeof(server_addr.sin_addr)     );

//connessione al server
retcode =
connect(client_socket, (struct sockaddr *) &server_addr,
    sizeof(server_addr) );
if (retcode == -1)
{perror("Errore durante la connnessione"); exit(2);}

//invio della stringa "esercizio"
msg="esercizio";
//printf("\n%s",msg);

//invio il messaggio
msg_len=strlen(msg)+1;
retcode=write(client_socket,msg,msg_len);
printf("Inviati %d (%d requested) bytes sulla socket %d\n",retcode, msg_len, client_socket);

//ricezione dello stream dal server
while ((retcode = read(client_socket, buffer, MAXBUF))> 0) {


buffer[retcode] = '\0';
}


printf("****************\n");
printf("stampaIntervallo 2 4\n");
stampaIntervallo_2(2,4);
printf("****************\n");
printf("\n****************\n");
printf("cerco un numero nella riga 8");
int riga=numeroRiga_2(8);
printf("\nnumero trovato nella riga 8= %d\n",riga);
printf("\nstampaIntervallo dalla 8 alla 8+riga(%d)\n",riga);
stampaIntervallo_2(8,8+riga);




retcode = close(client_socket);
exit(0);

}//main

le funzioni stampaIntervallo_2 e numeroRiga_2 si chiamano cosi (con suffisso _2) perchè originariamente le avevo fatte in un altro modo e non ho voluto cancellare il codice. comunque ecco il resto del client con le funzioni stampaIntervallo_2 e numeroRiga_2

stampaIntervallo_2

Code:


stampaIntervallo_2(int from,int to)
{
 strcpy(bufferAppoggio,buffer);//la funzione strtok cancella il buffer
 char* p;
 p = strtok(bufferAppoggio, "\n");
 int contaRighe=1;
while (p != NULL)
{
if(contaRighe>=from && contaRighe<=to)
printf("%s\n", p);

p = strtok(NULL, "\n");
contaRighe++;
}
 }


numeroRiga_2

Code:

int numeroRiga_2(int riga)
 {
    strcpy(bufferAppoggio,buffer);
    char* p;
    p = strtok(bufferAppoggio, "\n");
    int contaRighe=1;
    char numero[10];
     int indice=0;
     int i;
     
     while (p != NULL && indice==0)
     {
        if(contaRighe==riga)
        {
            if (p[0]<'0' || p[0]>'9')
            {
                printf("la riga %d non inizia con un numero.... trovato---> %c",riga,p[i]);
                exit(-1);
            }
           
            for(i=0;p[i]!='\0';i++)
            {
                if(p[i]>='0' && p[i]<='9')
                {
                    numero[indice]=p[i];
                    indice++;
                }
                else break;
             }
        }   
        p = strtok(NULL, "\n");
        contaRighe++;
     }
     return atoi(numero);
 }


le funzioni sono molto semplici e utilizzano il mentodo strtok() che sarebbe l'equivalente di split() per java e visual basic o explode() per di php...

il server che ho usato per fare le prove lo posto se volete ma fa la connessione come nella maggior parte degli esempi del prof, poi fa una recv  (se faccio una read non funziona= il client resta in attesa ed il server non riceve niente) ... poi con una write manda una stringa inizializzata come segue:

Code:
char buffer[MAXBUF]="ciao sono la riga 1\nio sono la riga2\nio invece sono la riga3\nriga4\nriga5\n1riga6\n5rga7\n4riga8\n312joiji riga 9\nkoko riga 10\njiji riga 11\nriga 12 (dovresti visualizzare questa riga per ultima infatti 8+4=12)\njoiji riga 13\nkoko riga 14\njiji riga 15";


non invio una stringa di 30000 righe ma l'esercizio è lo stesso:
Client:
   -connette a localhost 3002
   -invia la stringa "esercizio"
   -riceve un testo dal server
   -stampa dalla riga 2 alla riga 4
   -cerca un numero all'inizio della riga 8
   -stampa dalla riga 8 alla riga 8+<numero trovato>

Domande:
1) nel compito d'esame che stiamo considerando questa è una soluzione corretta??
2) ho trattato la risposta del server come se fosse un qualsiasi messaggio (mettendola in un char *)... è quello che richiedeva il compito oppure bisogna trattare la risposta del server in modo diverso??
3) il server simula correttamente quello che fa il client del prof?? se non fosse cosi avrei fatto il client basandomi su un server sbagliato ===> avrei sbagliato anche il client
4) (per shiny) hai trovato una soluzione (migliore || piu effiiciente || piu semplice || piu corretta || piu....)... se si potresti postarla??


Title: Re:compito di laboratorio
Post by: alex180788 on 30-09-2010, 09:48:25
 .arrossisco .arrossisco .arrossisco scusate ma quello sopra non è l'esercizio d'esame richiesto originariamente da Nova ma è sempre un esercizio d'esame ed è molto simile a quello richiesto ma i miei dubbi restano dato che riguardano la connessione e la ricezione dello stream dal server :(

ecco il testo:
scrivere in C o Java un programma che:
1 apra la connessione verso l'ip 151.97.252.5, port 80
2 invii la stringa "esercizio"
3 nello stream di testo ricevuto, salti le prime 22015 righe e scriva sulla standard output le righe dalla 22016 alla 22023
4 salti le altre 3828 righe in avanti
5 legga il numero all'inizio della nuova riga corrente: si tratta di un ulteriore numero di riga che diremo n
6 scriva le righe dalla n alla n+8

ecco le domande "adeguate":  :D

1) nel compito d'esame che STO considerando questa è una soluzione corretta??
2) ho trattato la risposta del server come se fosse un qualsiasi messaggio (mettendola in un char *)... è quello che richiedeva il compito DI CUI PARLAVA NOVA oppure bisogna trattare la risposta del server in modo diverso??
3) il server simula correttamente quello che fa il client del prof?? se non fosse cosi avrei fatto il client basandomi su un server sbagliato ===> avrei sbagliato anche il client
4) (per shiny) TROVERESTI una soluzione (migliore || piu effiiciente || piu semplice || piu corretta || piu....)... se si potresti postarla??

scusate la distrazione ma sono abbastanza fuso ultimamente...  :-)| :-)| :-)|


Title: Re:compito di laboratorio
Post by: alex180788 on 01-10-2010, 09:42:02




perche' non la scrivi te e non la posti? Io personalmente non l'ho fatta in quanto come puoi vedere dal post sotto citato non mi era stato chiesto. inoltre non credo sia la parte + difficile quella mancante perche' in lab ci avro' messo 10 mins a farla... si tratta giusto di aprire una socket e scaricarti un file. 

bé... fatto  .smile