Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [c] Read e write su client server

    Ciao ragazzi

    devo inviare delle STRINGHE da un client ad un server da riga di comando

    il client li legge e li deve inviare al server

    Premesso che io da client invio prima la lunghezza della stringa sul socket e poi dopo la stringa effettiva

    esempio
    invio 5 e poi MARCO

    così io da lato server saprò prima il numero di caratteri da leggere e poi la stringa effettiva


    il mio problema e che il server non riceve effettivamente le stringhe che gli mando

    vi mando un pezzo ( dato che poi si ripete per le altre variabili come il cognome la materia la data ecc)

    CLIENT

    strcpy(nomeprof,argv[4]); //NOME PROFESSORE//
    n=strlen(nomeprof);
    printf(" nome ===>%d\n " ,n);
    sprintf(strlung,"%d", n);
    write(cli_fd,strlung,strlen(strlung));
    write(cli_fd,nomeprof,strlen(nomeprof));


    SERVER

    read(client_fd,strlung,3); /* leggo il NOME PROFESSORE*/
    lung=atoi(strlung);
    read(client_fd,nomeprof,lung);
    n=strlen(nomeprof);
    printf("nomelung ===>%d\n " ,lung); // stampa lunghezza stringa ricevuta
    write(1,nomeprof,lung);
    write(1,"\n",1);


    se poi è neccessario vi invio tutto il codice

    grazie per le risposte

  2. #2

    Re: [c] Read e write su client server

    SERVER

    read(client_fd,strlung,3); /* leggo il NOME PROFESSORE*/
    lung=atoi(strlung);
    read(client_fd,nomeprof,lung);
    n=strlen(nomeprof);
    printf("nome ===>%d\n " ,n);
    printf("nomelung ===>%d\n " ,lung);
    write(1,nomeprof,lung);
    write(1,"\n",1);
    A quanto pare lato server ti aspetti una lunghezza fissa su tre cifre, ma lato client non stai formattando la lunghezza correttamente. Inoltre atoi si basa sul terminatore nullo, quindi metterei strlung[3] = '\0' prima di fare la conversione.

    Anche la strlen su nomeprof può soffrire di quel problema. E tra l'altro non ne vedo l'utilità visto che sarà pari a lung se non sbaglio.

    HTH,

  3. #3

    Re: Re: [c] Read e write su client server

    Originariamente inviato da ESSE-EFFE
    A quanto pare lato server ti aspetti una lunghezza fissa su tre cifre, ma lato client non stai formattando la lunghezza correttamente. Inoltre atoi si basa sul terminatore nullo, quindi metterei strlung[3] = '\0' prima di fare la conversione.

    Anche la strlen su nomeprof può soffrire di quel problema. E tra l'altro non ne vedo l'utilità visto che sarà pari a lung se non sbaglio.

    HTH,
    se io scrivo dal lato server io metto una read di 3 perchè non so a priori quanti byte riceverò quindi la mia domanda è se dal lato client la strung è di un solo byte dal lato server anche se metterò a strlung 3 = '\0' riceverò la stringa esatta che ho mandato?

  4. #4

    Re: Re: Re: [c] Read e write su client server

    Originariamente inviato da ubuntuunixc
    se io scrivo dal lato server io metto una read di 3 perchè non so a priori quanti byte riceverò quindi la mia domanda è se dal lato client la strung è di un solo byte dal lato server anche se metterò a strlung 3 = '\0' riceverò la stringa esatta che ho mandato?
    Per come hai impostato la comunicazione, lato server non puoi non sapere quanti byte indicano la lunghezza, devono essere 3 cifre. Quindi lato client formatterai la lunghezza sempre su 3 cifre ("%03d") e lato server leggerai sempre 3 byte prima di calcolarti la lunghezza.

  5. #5

    Re: Re: Re: Re: [c] Read e write su client server

    Originariamente inviato da ESSE-EFFE
    Per come hai impostato la comunicazione, lato server non puoi non sapere quanti byte indicano la lunghezza, devono essere 3 cifre. Quindi lato client formatterai la lunghezza sempre su 3 cifre ("%03d") e lato server leggerai sempre 3 byte prima di calcolarti la lunghezza.
    ok ho capito devo formattare la stinga in modo da riempirla tutta , ma da lato server una volta ricevuta questa stringa come posso fare per DEFORMATTARLA?

    cioè ho la stinga riempita con tutti caratteri "spazio" come posso ottenere caratteri validi ovvero la stringa reale senza avere caratteri "aggiuntivi" ?

  6. #6

    Re: Re: Re: Re: Re: [c] Read e write su client server

    cioè ho la stinga riempita con tutti caratteri "spazio"
    No, se usi il formato che ti ho indicato il carattere di riempimento è '0'. Cioè non invierai "5" (per esempio), ma "005".

    come posso ottenere caratteri validi ovvero la stringa reale senza avere caratteri "aggiuntivi" ?
    Come già facevi va bene: leggi i 3 byte (caratteri), metti il terminatore nullo e converti in intero.

  7. #7

    Re: Re: Re: Re: Re: Re: [c] Read e write su client server

    Originariamente inviato da ESSE-EFFE
    No, se usi il formato che ti ho indicato il carattere di riempimento è '0'. Cioè non invierai "5" (per esempio), ma "005".



    Come già facevi va bene: leggi i 3 byte (caratteri), metti il terminatore nullo e converti in intero.
    è se usassi %3d senza lo zero ?
    per la stringa nomeprof come faccio ad ottenere solo il nome del professore all'interno della stringa?

  8. #8

    Re: Re: Re: Re: Re: Re: Re: [c] Read e write su client server

    è se usassi %3d senza lo zero ?
    Va bene lo stesso. Consulta la documentazione per atoi.

    per la stringa nomeprof come faccio ad ottenere solo il nome del professore all'interno della stringa?
    Perchè, che altro c'è nella stringa? Comincia a provare con le modifiche che ti ho indicato, poi se serve chiedi ulteriori chiarimenti.

  9. #9
    Grazie ho risolto però ho un ultimo problema

    il mio programma deve ricerere da linea di comando vari parametri per l'esattezza 9 parametri ( nome ,cognome ,orario, ecc) l'ultimo è un SI o un NO per vedere se è necessario il proiettore

    con le tue correzioni funzionano tutti i primi 8 paramentri

    ma ho un problema sull'ultimo

    client

    strcpy(proiettore,argv[9]); // PROIETTORE SI/NO//
    sprintf(strlung,"%3d",(int)strlen(proiettore));
    write(cli_fd,strlung,strlen(strlung));
    write(cli_fd,proiettore,strlen(proiettore));
    printf("il valore di proiettore è %s \n",proiettore);
    printf("il valore di strlung è %s \n",strlung);

    server
    read(client_fd,strlung,3);
    lung=atoi(strlung);
    read(client_fd,proiettore,lung);
    write(1,proiettore,lung);
    write(1,"\n",1);

    non riesco a mandare questa stinga di soli 2 caratteri ( SI NO)

    mi visualizza a video
    una stringa di 5 caratteri composta da due spazi il numero 2 e SI o NO

    cioè
    2SI
    oppure
    2No

    praticamente riceve invece il valore 2 come lunghezza della stringa riceve 5 che sarebbe la lunghezza delle stringhe ricevute in precedenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.