c++字符字节数组

c++ byte array of chars

本文关键字:数组 字节数 字节 字符 c++      更新时间:2023-10-16

我遇到了字符字节数组的问题。我正在创建文件传输程序,它通过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: %lun", 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]);

如果recv失败,它返回SOCKET_ERROR,但您不检查它,而是使用它作为接收到的字节数。由于SOCKET_ERROR#define d到-1,您可以有效地从buffer之前的地址读取。

编辑:原来的答案是错误的,因为在这种情况下,循环根本不会执行。然而,问题是向量的内容不是以空结束的(因为它是一个没有任何字符串语义的普通缓冲区),所以它看起来像垃圾,但实际上是可以的。