salve,
ho riscontrato uno strano problema programmando in C sotto ambiente linux.
Si tratta di un progettino accademico.
Classico modello client/server (che girano in locale sulla stessa macchina), una mini-mini-versione di istant messaging.
Quando cerco di mandare un messaggio ad una persona la cui login è lunga esattamente 5 caratteri, la split_arg o forse la lettura da namedpipe, mi aggiunge della roba (nonostante la strlen "spergiuri" che si tratta ancora di una stringa di 5 caratteri.)
Queste sono le righe incriminate :
codice:
char ** split_arg(char *linea, char *separatori, int *numerotoken)
{
int i = 0; /* numero token trovati */
char **argv; /* vettore dei token */
char *copialinea; /* copia della linea */
char **indirizzocopialinea = &copialinea; /* punta a copialinea */
/* copia la stringa argomento */
copialinea = (char *) malloc( strlen(linea) + 1 );
strcpy(copialinea, linea);
/* alloco prima posizione vettore dei token */
argv = (char **) malloc(sizeof(char *));
while( (argv[i] = strsep(indirizzocopialinea, separatori)) != NULL ) {
/* ancora un token */
i++;
/* ridimensiona vettore dei token */
argv = (char **) realloc(argv, (i + 1) * sizeof(char *));
}
/* scrive il numero di token trovati */
*numerotoken = i;
/* libera lo spazio allocato */
free(copialinea);
return(argv);
}
/*fine split_arg*/
Questa l'ha scritta la prof, funziona ma se puo' servire...
codice:
/*
File: send_una_sola_write.c
Description: funzione di scrittura su pipe con protocollo variabile che usa
una sola write per evitare malfunzionamenti in caso di piu' processi
scrittori
*/
/*
@description -- funzione di scrittura su pipe con protocollo variabile
che usa una sola write
@param fdpipe -- file descriptor della pipe
@parame message -- messaggio da trasmettere (una stringa) non puo' essere
NULL
*/
void sendmessageonpipe(int fdpipe, char * message)
/*in base a message, crea un opportuno messaggio secondo
la codifica a lunghezza variabile e lo invia sulla pipe*/
{
char * msg;
int lung;
/*alloco memoria per il messaggio, per la sua lunghezza e per il terminatore*/
if (!(msg = malloc(sizeof(int)+strlen(message)+1))) {
WRITELN("Errore allocando memoria per un messaggio");
exit(-1);
}
lung = strlen(message);
/*scrivo la lunghezza del messaggio in testa a msg*/
memcpy(msg,&lung,sizeof(int));
/*dopo la lunghezza copio integralmente message (la strcpy mette il terminatore)*/
strcpy(msg+sizeof(int),message);
WRITE("sendmessageonpipe: ");
WRITELN(message);
/*invio il tutto sulla pipe*/
IFERROR(write(fdpipe,msg,lung+sizeof(int)),"Errore scrivendo su una pipe");
}
/*fine sendmessageonpipe*/
Dalla pipe leggo cosi':
codice:
IFERROR(fdpipeC = open(clientpipe, O_RDONLY), "Errore: apertura pipe server client");
read(fdpipeC, &lunghezza, sizeof(int));
msg = calloc((lunghezza),sizeof(char));
read(fdpipeC, msg, lunghezza);
IFERROR(close(fdpipeC), "Errore: chiusura pipe server client");
risptok = split_arg(msg, " ", &ntok);
free(msg);
/*fine lettura*/
In pratica se il secondo token e' di 5 caratteri viene corrotto, mentre se misura una qualsiasi lunghezza != 5
funziona perfettamente!
scusate per l'enorme lunghezza del messaggio, ma sono disperato