У меня возникли проблемы с пониманием, почему я получаю ошибку сегментации на домашнем веб-сервере. Я пытаюсь правильно пометить тип содержимого для документов .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);
}