C Ошибка сегментации веб-сервера - PullRequest
0 голосов
/ 10 марта 2019

У меня возникли проблемы с пониманием, почему я получаю ошибку сегментации на домашнем веб-сервере. Я пытаюсь правильно пометить тип содержимого для документов .html и .txt. Я могу нормально открыть файл .html в своем веб-браузере, когда мой сервер работает. Однако мой сервер закрывается из-за ошибки сегментации, когда я пытаюсь открыть документ .txt. Код ниже, где я получаю проблему.

void* thread_runner(void* sockfd)
{
    char buffer[256];
    int n;
    int sock = *(int*)sockfd;
    bzero(buffer,256);
    char filename[256];
    bzero(filename,256);
        n = read(sock,filename,255);
    if (n < 0) error("ERROR reading from socket");

    FILE *fp;
    char file[4096];
    char* word = strtok(filename, " ");
    word = strtok(NULL, " ");
    word++;
    printf("filename = \"%s\"\n", word);
    fp = fopen(word, "r");
    if (fp == NULL) {
        printf("file pointer is NULL\n");
        return 0;
    }
    char string[4096];
    char* extension;
    bzero(string, 4096);
    bzero(file, 4096);
    char* word2;
    word2 = strtok(word, ".");
    while ((word2 = strtok(NULL, ".")) != NULL)
    {
        extension = word2;
    }
    printf("File Extension: %s\n", extension);
    if (strncmp(extension, "html", 4096) == 0) {
        printf("HTML FILE FOUND\n");
        strcat(string, "HTTP/1.1 200 OK\nContent-Type: text/html\nContent-Length: 4096    \nConnection: keep-alive\n\n");
    }

    else if (strncmp(extension, "txt", 4096) == 0) {
        printf("TXT FILE FOUND\n");
        strcat(string, "HTTP/1.1 200 OK\nContent-Type: text/plain\nContent-Length: 4096\nConnection: keep-alive\n\n");
    }

ошибка возникает в этом цикле. Я использовал bzero для «строки».

    while (fgets(file, 4096, fp))
    {
        strcat(string, file);
    }
    //printf("Sending text:%s", string);
    printf("The requested file was: %s.%s\n",word,extension);
    n = write(sock,string,4096);
    printf("file contents are %s\n", string);
    fclose(fp);



    if (n < 0) error("ERROR writing to socket");
    if (n == 0)
    {
        close(sock);
    }

1 Ответ

2 голосов
/ 10 марта 2019

Вы пишете после конца string.string содержит только 4096 символов, но ваш цикл пытается прочитать весь файл в нем, когда он продолжает вызывать strcat() в цикле.

Вместо объединения всего файла в переменную и последующей записивсе, используйте fread(), чтобы прочитать файл порциями и немедленно записать их в сокет.Нет необходимости читать построчно.

size_t in;
while ((in = fread(file, 1, sizeof file, fp) > 0) {
    int n = write(sock, file, in);
    if (n < in) {
        error("ERROR writing to socket");
    }
}
close(sock);
fclose(fp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...