Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49

    [C] Problema invio struttura tramite socket

    Ciao a tutti!! Ho un problema di invio di una struttura su socket stream unix che non riesco a risolvere!!
    vi spiego la struttura e' cosi definita:
    codice:
    typedef struct {
    int i;
    char* nome;
    
    }Str;
    
    Str struc;
    avendo come secondo valore una stringa non definita ho pensato di poter calcolare la dimensione a tempo di esecuzione...allocare memoria ad hoc...e mandare alla parte Server prima la dimensione di nome e poi la struttura';
    codice:
    struc.nome = (char*) malloc(sizeof(char)*dimNome);
    quindi mando tutto usando la una write in parte client.... e leggo tutto usando una read in parte Server
    codice:
    // parte client
    
    if(write(sd, &struc, sizeof(Str))<0)
      {   perror("errore scrittura struct.."); break; } 
    
    //parte server ricezione (nel server la struttura e' allocata dinamicamente.
     if( read(conn_sd, struc, sizeof(Str))<0)
       {
             perror("Attenzione Errore read struct..");
        }
    E' possibile fare cio' ? Perche i dati passano...ma il server non stampa niente...di quello che dovrebbe stampare ehehehe
    Ultima modifica di soulbw; 06-11-2014 a 13:06

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Se invii la struttura, invii il puntatore alla stringa e non la stringa. Del puntatore, nell'altro sistema, non te ne fai nulla ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    considera i seguenti punti:

    - un char* sono pochi byte che contengono un numero che rappresenta un indirizzo di memoria, tale indirizzo
    dopo la tua malloc corrisponde al valore ritornato dalla malloc
    - la memoria allocata con malloc puo' essere ovunque nello heap, e' il sistema operativo che decide dove allocarla
    - sizeof(Str) ritorna la dimensione di un int + la dimensione di un char*, il che non include la dimensione della memoria puntata dal puntatore
    - i e nome sono allocati contiguamente in memoria in quanto parte della stessa struct, ma la memoria puntata da nome puo' essere
    da tutt'altra parte, come detto nel punto 2
    - se vuoi inviare la stringa puntata da nome devi passare a write l'indirizzo della memoria allocata dinamicamente e la dimensione della stessa.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49
    Intanto Grazie Mille per le vostre risposte!!! Gentilissimi!!...
    Quindi ricapitolando....dovrei passare prima la struttura e poi l area puntata dal char*....e poi riassegnarla sulla struttura del server.....
    tuttavia se io dichiarassi Str cosi
    codice:
    typedef struct{
    int i;
    char nome[20];
    
    }Str;
    la write scriverebbe tutta la stringa...o mi sbaglio?

    Se io utilizassi una socket datagram....e mandassi la struttura con una send
    codice:
    typedef struct{
     int i;
     char *nome;
    }Str;
    Sarebbe lo stesso discorso....fatto per la write!?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.