Я посещаю сетевой урок в школе и впервые использую C / GDB. Наша задача - создать веб-сервер, который будет взаимодействовать с клиентским браузером. Я в процессе и могу открывать файлы и отправлять их клиенту. Все идет хорошо, пока я не открою очень большой файл, а затем я обнаружил ошибку. Я не профессионал в C / GDB, поэтому мне жаль, если это заставляет меня задавать глупые вопросы и я не могу сам увидеть решение, но когда я смотрю на выброшенное ядро, я вижу, что моя ошибка сегмента приходит сюда:
if (-1 == (openfd = open(path, O_RDONLY)))
В частности, перед нами стоит задача открыть файл и отправить его в браузер клиента. Мой алгоритм гласит:
- Открыть / Ошибка перехвата
- Считать файл в буфер / Ошибка перехвата
- Отправить файл
Нам также было поручено убедиться, что сервер не падает при отправке очень больших файлов. Но моя проблема, кажется, с их открытием. Я могу отправить все мои меньшие файлы просто отлично. Размер файла составляет 29,5 МБ.
Весь алгоритм:
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. Извините, если это так. = (Но ваша помощь очень ценится.