我正在学校上网络课程,第一次使用C/GDB。我们的任务是制作一个与客户端浏览器通信的Web服务器。我已经很顺利地进行了,并且可以打开文件并将它们发送到客户端。一切都很顺利,直到我打开一个非常大的文件,然后程序就崩溃了。由于我不是C/GDB专家,所以如果这让我问一些愚蠢的问题并且不能自己找到解决方案,我感到很抱歉,但是当我查看核心转储时,我发现我的程序崩溃在这里:
if (-1 == (openfd = open(path, O_RDONLY)))
具体而言,我们的任务是打开文件并将其发送到客户端浏览器。我的算法如下:
- 打开/错误捕获
- 将文件读入缓冲区/错误捕获
- 发送文件
整个算法如下:
ssize_t send_file(int conn, char *path, int len, int blksize, char *mime) {
int openfd; // File descriptor for file we open at path
int temp; // Counter for the size of the file that we send
char buffer[len]; // Buffer to read the file we are opening that is len big
// Open the file
if (-1 == (openfd = open(path, O_RDONLY))) {
send_head(conn, "", 400, strlen(ERROR_400));
(void) send(conn, ERROR_400, strlen(ERROR_400), 0);
logwrite(stdout, CANT_OPEN);
return -1;
}
// Read from file
if (-1 == read(openfd, buffer, len)) {
send_head(conn, "", 400, strlen(ERROR_400));
(void) send(conn, ERROR_400, strlen(ERROR_400), 0);
logwrite(stdout, CANT_OPEN);
return -1;
}
(void) close(openfd);
// Send the buffer now
logwrite(stdout, SUC_REQ);
send_head(conn, mime, 200, len);
send(conn, &buffer[0], len, 0);
return len;
}
我不知道这是否只是因为我是Unix/C的新手。如果是,很抱歉。但是您的帮助将不胜感激。
char buffer[len]
--请不要在栈上分配巨大的数组(或巨大的任何东西)! - ephemient