|
|
|
![]() |
|
Strumenti |
![]() |
#1 | |
Member
Iscritto dal: Dec 2007
Messaggi: 284
|
[C] La write non vuole funzionare
Allo sto cercando di scrivere un carattere su un socket usando write.
alla funzione che si occupa di ciò passo l'int fc che è il file desscriptor del socket e questa struttura Codice:
typedef struct { char type; /** tipo del messaggio */ unsigned int length; /** lunghezza in byte */ char* buffer; /** buffer messaggio */ } message_t; Ora questa struttura é allocata così Codice:
message_t* msg; msg = malloc(sizeof(message_t)); msg->buffer = malloc(sizeof(char)*strlen(argv[1])+1); msg->type = MSG_CONNECT; msg->length = strlen(argv[1])+1; strcpy(msg->buffer,argv[1]); Questa é la funzione incriminata: Codice:
int sendMessage(int sc, message_t *msg){ int n =0; int a = sizeof(msg->type); int b = sizeof(char); printf(" SIZE: %d %d\n",a,b); /* SIZE: 1 1 */ printf("MESSAGGIO: %c \n",msg->type); /* MESSAGGIO: C é giusto*/ /*Qui la write fallisce */ EC_SC(n += write(sc,msg->type,sizeof(char)+1), "sendMessage"); EC_SC(n += write(sc,strlen(msg->buffer)+1,sizeof(int)), "sendMessage"); EC_SC(n += write(sc,msg->buffer,strlen(msg->buffer)+1), "sendMessage"); return n; } Valgrind mi da questo risultato: Quote:
Ora io se alla write passo una stringa a caso e come dimensione strlen+1 funziona, mentre con msg->type no. eppure msg->type (o msg->buffer) funzionano correttamente e stampando il loro contenuto é esatto ![]() |
|
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Nov 2010
Messaggi: 73
|
A primo impatto sembra che tu stia commettendo un errore pratico, sebbene il concetto sia giusto!
Partiamo dalla definizione della funzione write: prende come parametri un descrittore, un puntatore ad una locazione di memoria, una lunghezza. Il problema sta proprio nel secondo parametro, ovvero il puntatore: la tua ultima write è corretta, perché il parametro che passi è un puntatore ad una locazione di memoria che contiene una serie di byte (nello specifico dei caratteri che formano una stringa). Le altre due che la precedono, invece, sono espresse in modo scorretto, perché cerchi di passare non un puntatore alla locazione di memoria bensì un valore diretto. Prova a fare così: Codice:
int len = strlen(msg->buffer) + 1; EC_SC(n += write(sc, &(msg->type), sizeof(char)), "sendMessage"); EC_SC(n += write(sc, &len, sizeof(int)), "sendMessage"); EC_SC(n += write(sc, msg->buffer,strlen(msg->buffer)+1), "sendMessage"); |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:31.