为什么我无法通过HTTP服务器发送格式化的html文件

时间:2018-12-03 06:59:45

标签: c++ sockets http server

我有一个用C编写的http服务器,我打算将其用于处理正在构建的ios应用程序中的所有请求。例如,使用fopen()打开经过格式化以提高可读性的html文件时:

<html>
  <body>
    <h1>Hello World</h1>
  </body>
</html>

我得到一个空白网页。但是,如果我将所有内容写在一行上,就可以正常工作。 例如:

<html><body><h1>Hello World</h1></body></html>

我当时在想,也许我应该在尝试发送文件之前删除所有空白,但随后我必须考虑在单词和标记属性之间留出空格。

我不确定发送每行末尾带有返回字符的html文件的正确方法。有人可以解释为什么我得到一个空白网页吗?

这是我的基本http服务器:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define DEFAULT_PORT 3015
#define IP "198.58.105.140"

int main()
{
        FILE *html_data;
        html_data = fopen("index.html", "r");

        char response_data[1024];
        fgets(response_data, 1024, html_data);

        char http_header[2048] = "HTTP/1.1 200 OK\r\n\n";
        strcat(http_header, response_data);

        struct sockaddr_in addr;
        unsigned int addrlen = sizeof(addr);
        addr.sin_family = AF_INET;
        addr.sin_port = htons(DEFAULT_PORT);
        addr.sin_addr.s_addr = INADDR_ANY; //inet_pton(AF_INET, IP, &(addr.sin_addr));

        int socketListener = socket(AF_INET, SOCK_STREAM, 0);
        bind(socketListener, (struct sockaddr*)&addr, addrlen);
        listen(socketListener, SOMAXCONN);

        int newConnection;
        while(1)
        {
                newConnection = accept(socketListener, NULL, NULL);
                send(newConnection, http_header, sizeof(http_header), 0);
                //close(newConnection);
        }

        return 0;
}

1 个答案:

答案 0 :(得分:1)

fgets()仅从文件中读取一行。这就是当文件将所有内容都放在一行时服务器可以工作的原因。当您将其分布在多行中时,您仅发送第一行,即<html>,因此浏览器没有任何显示。

使用fread()阅读更多信息:

int size = fread(response_data, sizeof response_data - 1, 1, html_data);
response_data[size] = 0; // Add null terminator to string

当您发送数据时,您不应发送通过空终止符。使用strlen()而不是sizeof()来获取有效字符数。

send(newConnection, http_header, strlen(http_header), 0);