HTML-страница с сервером C?

#html #c #http

#HTML #c #http

Вопрос:

Если у вас запущен сервер, созданный вами на C, а затем вы подключаетесь к нему как клиент с помощью веб-браузера, как бы вы отображали HTML-страницу клиенту?

Я пытался просто написать html-код клиенту, но это не сработало, страница пуста.

Ответ №1:

Ваша программа на C должна возвращать HTML в ваш браузер путем печати в стандартный вывод. Самые первые несколько строк должны содержать, по крайней мере, следующий заголовок:

 Content-Type: text/html
  

После этой строки заголовка, за ней две пустые строки, а затем ваш HTML-контент. Вы можете добавить другие HTTP-заголовки по своему усмотрению перед двумя пустыми строками.

 #include <stdio.h>
int main(int argc,char** argv)
{
    printf("Content-Type: text/htmlrnrn");
    printf("<html><head><title>C Program</title></head>n");
    printf("<body><h1>It Works!</h1></body>n");
    printf("</html>n");
    return 0;
}
  

Комментарии:

1. Последовательность r n на самом деле требуется стандартом HTTP.

2. то есть она просто отправляется в стандартный вывод, а не клиенту?

3. Я думаю, @jbruni ошибочно предполагает, что вы используете CGI, чего у вас нет, как указано в вопросе.

4. Если вы пишете cgi-скрипт, вы выводите его в стандартный вывод, но если это полноценный веб-сервер, он должен записывать данные в сокет.

5. Попробуйте: HTTP/1.1 200 OKrnContent-Type: text/htmlrnrnrn , затем содержимое HTML.

Ответ №2:

Вам нужно будет передать данные HTML ASCII обратно через сокет клиенту. Итак, вы могли бы настроить буфер с заголовком HTML-ответа, который обычный браузер будет искать следующим образом:

 #define BUFFERSIZE 512

char buffer[BUFFERSIZE];

char html_body[] = "<html><head></head><body>Hello World!</body></html>rn";

char* temp_ptr = buffer;

int num_chars =  sprintf(temp_ptr, "HTTP/1.0 200 OKrn");
temp_ptr  = num_chars;

num_chars = sprintf(temp_ptr, "Content-Type: text/html; charset=UTF-8rn");
temp_ptr  = num_chars;

num_chars = sprintf(temp_ptr, "Content-Length: %drn", strlen(html_body));
temp_ptr  = num_chars;

num_chars = sprintf(temp_ptr, "Accept-Ranges: bytesrn");

num_chars = sprintf(temp_ptr, "Connection: closernrn");
temp_ptr  = num_chars;

num_chars = sprintf(temp_ptr, html_body);
temp_ptr  = num_chars;

int total_message_length = temp_ptr - buffer;

int bytes_written = write(socket_file_descriptor, buffer, total_message_length);

//... do any error-checking on your write to the socket ...
  

Вам определенно следует изучить больше информации о протоколе HTTP, чтобы настроить надлежащий веб-сервер, который правильно реагирует на веб-браузеры, ожидающие стандартных ответов.

Комментарии:

1. Content-Length Должна быть длина содержимого после заголовка, а не размер вашего буфера.