Pages: 1 [2]   Go Down
Print
Author Topic: compito di laboratorio  (Read 4029 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #15 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??
Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #16 on: 30-09-2010, 09:48:25 »

  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 Sad

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":  Cheesy

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...  testate testate testate
Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #17 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 
Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
Pages: 1 [2]   Go Up
Print
Jump to: