Puntatori e socket

di il
24 risposte

Puntatori e socket

Salve ho un problema che non riesco a risolvere, devo passare questa struttura attraverso un socket:

struttura
typedef struct {
    message_data_hdr_t  hdr;
    char               *buf;
} message_data_t;
dove hdr è un ulteriore struttura ma non mi da problemi nel passaggio...il mio problema è come mandare *buf ho provato nel seguente modo:
int readData(long fd, message_data_t *data){
	int fatto;
	while(1){
		fatto=read(fd,&(data->hdr),sizeof(message_data_hdr_t));
		if(fatto!=EINTR || fatto<=0){
			break;
		}
	}
	char buff[data->hdr.len];
	while(1){
		fatto=read(fd,buff,data->hdr.len);
		if(fatto!=EINTR || fatto<=0){
			break;
		}
	}
	if(fatto<0){
		return -1;
	}else{
		data->buf=malloc((data->hdr.len)*sizeof(char));
		strncpy(data->buf,buff,data->hdr.len);
		return fatto;
	}
}	
int sendData(long fd, message_data_t *msg){
	int fatto;
	while(1){
		fatto=write(fd,&(msg->hdr),sizeof(message_data_hdr_t));
		if(fatto!=EINTR || fatto<=0){
			break;
		}
	}
	char buff[1024];
	strncpy(buff,msg->buf,msg->hdr.len);
	while(1){
		fatto=write(fd,buff,msg->hdr.len);
		if(fatto!=EINTR || fatto<=0){
			break;
		}
	}
	if(fatto<0){
		return -1;
	}else{
		return fatto;
	}
}
però ovviamente non funziona penso che sia per un fatto che non si possono fare due write/read consecutivamente o meglio in teoria si ma non so come poterlo fare capire al "lettore" che deve saltare i bit che contengono la prima informazione.
Avevo pensato, come ultima spiaggia perchè mi sembra una soluzione poco elegante, di fare una write in "send" che poi fa una read in attesa che "read" mandi una risposta di conferma e poi mandare la buf ma ripeto farei così solo se non ci sono altre scelte.

Spero mi possiate aiutare il prima possibile, grazie

P.S. la struttura non puo' essere cambiata in nessuna maniera

24 Risposte

  • Re: Puntatori e socket

    Non puoi inviare e ricevere un puntatore. Che senso ha?
  • Re: Puntatori e socket

    È un client-server in locale sulla stessa macchina...il *buf è un messaggio che client e server si devono scambiare
  • Re: Puntatori e socket

    Considerando che
    
    fatto=write(fd,buff,data->hdr.len);
    
    sia un errore di copia incolla, nel senso che serve una read non una write, un il problema che vedo è che il seguente codice
    
    fatto=write(fd,buff,strlen(msg->buf));
    
    Non sta inviando il nul-terminator della stringa.

    Supponendo inoltre che data->hdr.len contenga esattamente il valore di strlen(msg->buf) Il receiver, quando fai strncpy copierà in data.buf una stringa non terminata.
  • Re: Puntatori e socket

    maffo95 ha scritto:


    è un client-server in locale sulla stessa macchina...
    E questo che vuol dire? Il puntatore non puoi passarlo tra processi diversi. O meglio, non devi utilizzarlo nel processo ricevente.
    Devi inviare i dati puntati con il terminatore e chi riceve deve riallocare il buffer con un nuovo puntatore.
  • Re: Puntatori e socket

    Effettivamente si il fatto che non passava anche il valore di terminazione è uno sbaglio (quando copiavo nella send il messaggio nella buff) ma anche modificandolo non cambia niente il messaggio no parte (ho modificato il codice postato).
    data->hdr.len contiente la strlen(msg->buf)+1 quindi li l'avevo considerato.
    Ho verificato anche che la prima read avviene con successo cioè hdr viene passato il problema è il messaggio che non riesco ad inviare.
  • Re: Puntatori e socket

    oregon ha scritto:


    maffo95 ha scritto:


    è un client-server in locale sulla stessa macchina...
    E questo che vuol dire? Il puntatore non puoi passarlo tra processi diversi. O meglio, non devi utilizzarlo nel processo ricevente.
    Devi inviare i dati puntati con il terminatore e chi riceve deve riallocare il buffer con un nuovo puntatore.
    Eh ma scusa non è quello che sto facendo? io prima di inviare il "messaggio" lo scrivo in buff e scrivo quello nella socket faccio a mo di copia e incolla e poi il client prende e lo trascrive in un buffer che poi verrà copiato nella sua struttura.
  • Re: Puntatori e socket

    Con non parte cosa vuoi dire: non esce dalla write (lato sender) o la read (latore receiver) che torna errore o non torna proprio?
  • Re: Puntatori e socket

    Il lato della read legge e trascrive ? il messaggio a regola è stato scritto, o almeno penso in quanto non mi da nessun errore, c'è un modo per vedere cosa c'è scritto nella socket in maniera "esterna" al programma?
  • Re: Puntatori e socket

    Mi sono perso......
  • Re: Puntatori e socket

    Il programma del cliente mi dice che il messaggio che gli è arrivato è ? (che non so bene cosa significa ma sicuramente non è il messaggio che gli ha inviato) nella "send" il messaggio (msg->buf) viene correttamente scritto nel buff e lo invia senza alcun tipo di errore, ora però non so se il problema è nel lato sender o receiver e volevo sapere da te se era possibile in qualche modo "vedere" cosa c'è scritto effettivamente nella socket direttamente nel file socket che ho creato prima che il server effettui la lettura
  • Re: Puntatori e socket

    Se posso permettermi stai facendo un gran... minestrone.
    punto 1: usa un programmello che manda messaggi sulle socket, così vedi subito se il server funziona
    punto 2: per intercettare i pacchetti potresti sniffare tutta la rete, mettendone magari una virtuale in modalità promiscua, o con qualche programmello alla caine (e relativo software di intercettazione pacchetti).
    punto 3: per spedire "strutture" mediante messaggi tipicamente li si incapsula in un protocollo che ti inventi, simil JSON.
    Essenzialmente nulla ti impedisce di fare qualcosa del genere...
    MESSAGGIO=qualcosa;DATI=qualcosa;LUNGHEZZABODY=qualcosa;BODY=...

    e, lato server, decodificando la stringa messaggio (ovviamente più la fai semplice, meglio è)

    non mi sembri molto pratico, andrei quindi di punto 1
  • Re: Puntatori e socket

    Il problema è il messaggio non le strutture...le strutture riesco ad inviarle tranquillamente tutto quello che è contenuto in hdr, per esempio, il client lo riceve e viceversa.
    Se ho capito bene (nel terzo punto) dovrei creare un unica stringa e inviarla e chi riceve la deve sequenziare?
  • Re: Puntatori e socket

    Se la read lato client non torna errore É solo perché nom c'è stato nessun errore. Comunque la read ti torna il numero di caratteri effettivamente letti. La read non torna il numero di caratteri che richiedi con il terzo parametro che le passi, ma legge al massimo quel numero di caratteri.

    Quindi, come prima cosa devi contare i caratteri letti fino a che non raggiungi il numero che ti aspetti.

    Tutto questo assumendo che stai lavorando in blocking-mode.
  • Re: Puntatori e socket

    Per prima cosa ti ringrazio per l'aiuto che mi stai dando fino ad ora
    Dopo un pomeriggio di approfondimento sulle socket ho riscritto un po' il mio codice e si avevo notato l'errore (anche se ho letto che è difficile che la read o la write non avvengano in maniera atomica) che mi stai dicendo e infatti ho postato il codice sul post iniziale della discussione ma il problema è rimasto e non so più dove sbattere la testa :S
Devi accedere o registrarti per scrivere nel forum
24 risposte