2016-04-20 3 views
0

Пункт назначения возвращает правильный байт, но возвращаемая строка - это мусор. Функциябуфер, заполненный корзиной с помощью recv

Подсобная:

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; 
} 

Это мой отправитель:

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); 

Это simplifcation того, что я делаю на ресивер:

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); 

Если я проверить память buff_readed_aux Значение правильное, но буфер заполнен корзиной.

Пример значений, которые я получаю на отпечатках:

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

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

Я не понимаю Что происходит, я попытался использовать «bzero» для инициализации буфера без везения. Я подтвердил с помощью wirehark, что сообщение не правильно отправляется с сервера.

Tema выделяется в хэш-таблице, как это:

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 tema% s \ n", buff);' - НЕТ! Буфер не гарантируется с нулевым завершением. Если вы уверены, что всегда будете передавать текст или другие данные, которые не содержат внедренных нулей, вы можете обнулить нулевые данные буфера, используя «buff_readed_aux» в качестве индекса. Не забудьте оставить незаполненное пространство для нулевого значения, например, путем чтения символов «sizeof (buff) -1». «bzero()» - это расточительное кодирование грузило, но должно было сработать. –

+0

@MartinJames Строка с нулевым завершением, otherwhength длина в buff_readed_aux была бы неправильной из-за strlen. Хорошо, я заметил ошибку из-за вас, я отправил 7 байт, я не отправил нулевое завершение. –

+1

Используйте wirehark, чтобы узнать, отправляется ли мусор клиентом, является результатом ошибок кода клиента или обоих. –

ответ

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

Как вы ожидали этого printf знать, сколько символов для печати? Магия?

Try, например:

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

также:

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 

Если tema содержит адрес того, что вы хотите отправить (как fprintf предполагает), почему вы пропусканием адрес от tema до send_all? Вы должны передать send_all адрес того, что вы хотите отправить, а не адрес того, что содержит адрес того, что вы хотите отправить!

+0

Я проверял память и бафф неправильно заполнен, так что это не главная проблема. –

+1

@ JesúsMartínBerlanga У вас, вероятно, есть * путь * более двух ошибок.(См. Обновления.) –