【问题标题】:Why is fprintf Giving Segmentation Fault?为什么 fprintf 给出分段错误?
【发布时间】:2021-07-19 07:55:25
【问题描述】:

我正在尝试编写这个函数,它将创建一个 HTML 文档,我可以在其中写入 404 错误消息,文件名在函数参数中给出。

fprintf 调用给了我分段错误,但核心转储。

对我做错了什么有什么想法吗?

void notFoundResponse(int clientSocket, char* fileName){
    char response[30] = {"HTTP/1.0 404 Not Found\r\n\n"};
    char buffer[256];
    FILE* file = fopen("404.html", "w+");
    
    fprintf(file, "<HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD><BODY><H1>Not Found</H1>The requested URL %s was not found on this server.<P>\r\n" , fileName);
    write(clientSocket, response, strlen(response) + 1);
    fread(buffer, 256, 1, file);
    write(clientSocket, buffer, strlen(buffer) + 1);
    
    fclose(file);
}

【问题讨论】:

  • 您需要fclose/fopenrewind 文件文件才能再次读取它。并始终检查函数的返回值。你可能会发现fread 返回 0。
  • 或者fopen可能已经失败并返回NULL,再次添加适当的错误检查。
  • strlen(buffer) 有问题,因为它缺少空字符。
  • 对于(例如)write(clientSocket, response, strlen(response) + 1); 将在末尾发送一个二进制 0x00。你确定那是你想要的吗?对于http 的大部分内容,这会使收件人感到困惑。我愿意:write(clientSocket, response, strlen(response));

标签: c networking segmentation-fault


【解决方案1】:

还有更多信息吗?

尝试将char response[30] = {"HTTP/1.0 404 Not Found\r\n\n"};修改为char response[64] = "HTTP/1.0 404 \r\nContent-Type: text/html\r\n\r\n"

也许你没有指定 Content-type,所以 HTTP 连接在你发送响应后关闭。我认为你应该指定 Content-type 来告诉客户端你稍后会发送一个 html 文件。

如果你很确定是fprintf segfault,请忽略我的回答。

如果我的回答严重错误,请发表评论,让我知道我会删除答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2020-08-22
    • 2013-10-20
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多