我有一个用于读取未知大小的 TCP 数据包的函数。该函数使用 MSG_PEEK 查找接收到的 JSON 消息(循环条件中的 \\'})所需的大小,然后运行循环...
我有一个用于读取未知大小的 TCP 数据包的函数。该函数使用 MSG_PEEK 查找接收到的 JSON 消息所需的大小( \"}
循环条件),然后在不使用 MSG_PEEK 的情况下再次运行循环以清理缓冲区。出于某种原因,函数末尾的两个打印工作正常,但当我调用 fn 时,我的程序在返回后立即死机并打印 \'*** 检测到堆栈粉碎 ***:已终止\'。不应该 content_buffer
溢出,因为我正在分配 content_size + 1
并传递 content_size
到 recv
正确的位置?
char *read_socket_raw(int socket)
{
if (socket == -1)
{
fprintf(stderr, "Reading socket failed.\n");
return NULL;
}
char *content_buffer = NULL;
unsigned short content_size;
why2_bool empty_buffer = 0; //WHETHER MSG_PEEK SHOULD BE USER OR NOT
do
{
//FIND THE SENT SIZE
content_size = 0;
if (ioctl(socket, FIONREAD, &content_size) < 0 || content_size <= 0) continue;
//ALLOCATE
content_buffer = realloc(content_buffer, content_size + 1);
read_section:
//READ JSON MESSAGE
if (recv(socket, content_buffer, content_size, !empty_buffer ? MSG_PEEK : 0) != content_size) //READ THE MESSAGE BY CHARACTERS
{
fprintf(stderr, "Socket probably read wrongly!\n");
}
if (empty_buffer) goto return_section; //STOP LOOPING
} while (content_buffer == NULL || strncmp(content_buffer + (content_size - 2), "\"}", 2) != 0);
//REMOVE JUNK FROM BUFFER (CUZ THE MSG_PEEK FLAG)
empty_buffer = 1;
goto read_section;
return_section:
content_buffer[content_size] = '\0';
printf("'%s'\n", content_buffer);
printf("'%p'\n\n", content_buffer);
return content_buffer;
}
函数返回时检测到堆栈溢出
下载声明:
本站所有软件和资料均为软件作者提供或网友推荐发布而来,仅供学习和研究使用,不得用于任何商业用途。如本站不慎侵犯你的版权请联系我,我将及时处理,并撤下相关内容!