2016-04-20 10 views
0

Das Ziel erhält die richtige Menge von Bytes, aber die empfangene Zeichenfolge ist Müll.Puffer gefüllt mit Papierkorb mit recv

Auxiliar Funktion:

ssize_t send_all(int socket, const void *buffer, size_t length, int flags) { 
    ssize_t n; 
    const char *p = buffer; 
    while (length > 0) 
    { 
     n = send(socket, p, length, flags); 
     if (n <= 0) break; 
     p += n; 
     length -= n; 
    } 
    return (n <= 0) ? -1 : 0; 
} 

Das ist mein Absender:

p_status_t aviso_gestion_tema(struct sockaddr_in id, char* tema, int tema_name_length, tipo_msg_intermediario precedente) { 

//... 

int cd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
if(connect(cd, (struct sockaddr*) &id, sizeof(id)) == -1) { 
    #ifdef DEBUG_ERR 
     fprintf(stderr, "connect: %s\n", strerror(errno)); 
    #endif 
    op_result = CALLBACK_TRANSM_ERROR; 
} 
else if(send(cd, &tipo, 1, 0) == -1) { op_result = CALLBACK_TRANSM_ERROR; } 
else if(send_all(cd, &tema, tema_name_length, 0) == -1) { op_result = CALLBACK_TRANSM_ERROR; } 

#ifdef DEBUG_MSG 
    fprintf(stderr, "aviso-gestion-gema (%d bytes): %s\n", tema_name_length, tema); 
#endif 

close(cd); 

Dies ist ein simplifcation von dem, was ich auf dem reciver:

int cd; 
char tipo_msg; 
struct sockaddr_in client_ain; 
socklen_t c_ain_size; 
char buff[BUFFER_SIZE]; 
ssize_t buff_readed_aux; 
unsigned int tema_name_length; 

c_ain_size = sizeof(client_ain); 
cd = accept(socket_recepcion, (struct sockaddr*)&client_ain, &c_ain_size); 
if(cd == -1) {...} 

tipo_msg = (char) 0; 
if(recv(cd, &tipo_msg, 1, 0) == -1) {...} 

buff_readed_aux = recv(cd, &buff, sizeof(buff), 0))); 
printf("\n-> Recibida alta tema %s\n", buff); 

Wenn ich den Speicher prüfen buff_readed_aux Wert ist korrekt, aber der Puffer ist mit Papierkorb gefüllt.

Beispiel für Werte, die ich auf den Drucken erhalten:

Client: aviso-gestion-gema (7 bytes): nombre1. 
Server: Recibida alta tema P�` 

Client: aviso-gestion-gema (5 bytes): nom#2 
Server: Recibida alta tema ��` 

Ich verstehe nicht, was passiert, habe ich versucht, ‚bzero‘ zu verwenden, um den Puffer ohne Glück zu initialisieren. Ich habe mit wireshark bestätigt, dass die Nachricht nicht korrekt vom Server gesendet wird.

Tema in einer Hash-Tabelle wie folgt zugeteilt:

tema_name_length = strlen(utstring_body(readed)); 
char* allocated = malloc(tema_name_length+1); // 1+ for nul termination 
strcpy(allocated, utstring_body(readed)); 
// store allocated in the hash-table 
+0

'printf ("\ n-> Recibida alta% s \ n", buff);' - NEIN! Der Puffer ist nicht garantiert null-terminiert. Wenn Sie sicher sind, dass Sie immer Text oder andere Daten übermitteln, die keine eingebetteten Nullen enthalten, können Sie die Pufferdaten mit "buff_readed_aux" als Index auf Null setzen. Achten Sie darauf, genügend Platz für die Null zu lassen, zB .. indem Sie 'sizeof (buff) -1' Zeichen lesen. 'bzero()' ist verschwenderischer Cargo- Kult-Code, hätte aber funktionieren sollen. –

+0

@MartinJames Die Zeichenfolge ist null terminiert, ansonsten wäre die Länge in buff_readed_aux wegen strlen falsch. Ok, ich habe den Fehler wegen dir entdeckt, ich habe 7 Bytes gesendet, ich habe den Nulltermin nicht gesendet. –

+1

Verwenden Sie wireshark um herauszufinden, ob der Müll vom Client gesendet wird, ist ein Ergebnis von Client-Code-Bugs oder beides. –

Antwort

1
buff_readed_aux = recv(cd, &buff, sizeof(buff), 0))); 
printf("\n-> Recibida alta tema %s\n", buff); 

Wie erwarten Sie diese printf, wie viele Zeichen zu wissen, drucken? Zauber?

Versuchen, zum Beispiel:

if (buff_readed_aux > 0) 
{ 
    printf("\n-> Recibida alta tema "); 
    for (int i = 0; i < buff_readed_aux; ++i) putchar(buff[i]); 
    printf("\n"); 
} 

auch:

else if(send_all(cd, &tema, tema_name_length, 0) == -1) { op_result = CALLBACK_TRANSM_ERROR; } 

#ifdef DEBUG_MSG 
    fprintf(stderr, "aviso-gestion-gema (%d bytes): %s\n", tema_name_length, tema); 
#endif 

Wenn tema hält die Adresse von dem, was Sie senden möchten (wie die fprintf schon sagt), warum Sie die Adresse sind vorbei von tema bis send_all? Sie sollen send_all die Adresse von dem übergeben, was Sie senden möchten, nicht die Adresse der Sache, die die Adresse von hält, was Sie senden möchten!

+0

Ich habe den Speicher überprüft und Buff ist falsch gefüllt, so dass das nicht das Hauptproblem ist. –

+1

@ JesúsMartínBerlanga Wahrscheinlich hast du * way * mehr als zwei Bugs.(Siehe Updates.) –