bytearray — c ++ байтовый массив символов

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

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

0

Решение

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

РЕДАКТИРОВАТЬ:
получается, что первоначальный ответ был неверным, так как в этом случае цикл не выполнялся бы вообще.
Однако проблема в том, что содержимое вектора не заканчивается нулем (так как это обычный буфер без какой-либо семантики строки), поэтому оно выглядит как мусор, но на самом деле все в порядке.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector