2013-03-08 3 views
0

У меня проблемы с байтовым массивом символов. Я создаю программу передачи файлов, которая передает двоичные данные через TCP-сокет. Итак, когда я получаю данные из кусков, я сохраняю их во временном контейнере, а затем мне нужно добавить где-нибудь, чтобы хранить целые данные. Я попытался зЬй :: вектор, но не работает (или я использую это неправильно.)C++ байтовый массив символов

size_t nbytes = 0; 
char buffer[5]; //temporary container. 
int result = 0; 
std::vector<char> abc; 

if (ioctl(sockfd, FIONREAD, (char*)&nbytes) < 0) 
{ 
    printf("[-] Error getting available data.\n"); 
    return -1; 
} 
printf("[*] Bytes available: %lu\n", nbytes); 

while(true) 
{ 
    if(nbytes > sizeof(buffer)) 
    { 
     result = recv(sockfd, buffer, sizeof(buffer), 0); 
     for(int i = 0; i < result; i++) 
     { 
      abc.push_back(buffer[i]); //big data causes memory corruption. 
     } 
     nbytes -= result; 
     continue; 
    } 
    else if(nbytes <= sizeof(buffer) && nbytes != 0) 
    { 
     result = recv(sockfd, buffer, nbytes, 0); 
     for(int i = 0; i < result; i++) 
     { 
      abc.push_back(buffer[i]); //big data causes memory corruption. 
     } 
     break; 
    } 
    else 
    { 
     result = 0; 
     break; 
    } 
} 

printf("Data Received: %s", &abc[0]); 
+1

Является ли кто-либо еще также полностью запутанным «байтовым массивом символов» или это только я. –

+0

Я уже привык к этому :) –

+0

Что я не понимаю, так это использование (очень малого) массива стилей C в качестве буфера. Почему бы не прочитать прямо в 'abc'? –

ответ

4

если recv не удается, то возвращается SOCKET_ERROR но не проверить его и вместо того, чтобы использовать его как число полученные байты. Поскольку SOCKET_ERROR является #define d до -1, вы эффективно читаете его с адреса до buffer.

EDIT: Оказалось, что исходный ответ был неправильным, поскольку в этом случае цикл не будет выполняться вообще. Однако проблема заключается в том, что содержимое вектора не заканчивается на нуль (так как это простой буфер без какой-либо семантики строк), поэтому он выглядит как мусор, но на самом деле это нормально.

+0

это просто небольшой разрез из кода, пропущенная проверка ошибок там, но все становится хорошо, но буфер все еще развращает. Спасибо. – Nika

+0

хорошо, сложно проанализировать код, который отличается от ошибочного :) –

+0

Я тестирую его под отладчиком, все работает отлично, я получаю целые данные, но векторный буфер развращает ... Я имею в виду, когда я получить данные и сохранить их там, он показывает мои данные + другие определяет символы. например: char * abc = "1234"; получил «AAAAAAAAAAA ...» он печатает «AAAAAAAA ... 1234 и некоторые случайные двоичные символы :( – Nika

Смежные вопросы