我遇到字符数组字符的问题。 我正在创建文件传输程序,它通过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 :(得分:4)
如果recv
失败,则返回SOCKET_ERROR
,但不检查它,而是将其用作接收字节数。由于SOCKET_ERROR
是#define
d到-1,您有效地从buffer
之前的地址读取。
编辑: 事实证明原始答案是错误的,因为在这种情况下循环根本不会执行。 但是,问题是向量的内容不是以null结尾的(因为它是一个没有任何字符串语义的普通缓冲区),所以它看起来像垃圾,但它实际上没问题。