#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
Должна быть длина содержимого после заголовка, а не размер вашего буфера.