Сервер, отображающий текст вместо HTML - PullRequest
2 голосов
/ 07 мая 2019

Я пытаюсь создать сервер C, который будет принимать входные данные и иметь возможность выкладывать их обратно пользователю в формате html, где сервер работает как пользовательский интерфейс. Моя текущая проблема, которую я не могу понять, это то, почему сервер C выкладывает HTML-код в виде текста на localhost: 3838 вместо того, чтобы отображать его как правильную веб-страницу.

Как я могу решить эту проблему и заставить ее работать, отправляя пользовательские команды обратно на сервер и выплевывая правильный ответ? Должен ли я сделать это, используя recieve, а затем поместив сообщение в буфер, проанализировав это сообщение, а затем поместив этот ответ в буфер для отправки обратно, используя send?

CSERVER.c

<code>#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>

#define PORT "3838" //port being connected to 
#define MAXLEN 800
#define BACKLOG 10 //number of pending connections to be held in queue

//format of html page 

char header []= 
"<!DOCTYPE html>\n"
"<html>\n"
"<head>\n"
"<title>Web-Based Remote Command Server</title>\n"
"</head>\n"
"<body>\n\n";
char input []= 
"<form action= \"/run\" method= \"get\"> \n"
"Command: <input type=\"text\" size=\"100\" name=\"command\">\n"
"<input type=\"submit\" value=\"Run\">\n"
"</form>";
char output []= "<p>Command that was run:</p>\n"
"<pre>Your server will include the command that was just run here.
\ п \ п» "

Стандартный вывод:

\ n" "
Your server will include the stdout results here.
\ n \ n" «

Стандартная ошибка:

\ n» "
Your server will include the stderr results here.
\ п \ п" " \ п" ""; char * buff = header; void sigchld_handler (int s) { (Пустоты) с; // тихое предупреждение о неиспользуемой переменной // waitpid () может переписать errno, поэтому мы сохраняем и восстанавливаем его int save_errno = errno; while (waitpid (-1, NULL, WNOHANG)> 0); errno = save_errno; } void * get_in_addr (struct sockaddr * sa) { if (sa-> sa_family == AF_INET) { return & (((struct sockaddr_in *) sa) -> sin_addr); } return & (((struct sockaddr_in6 *) sa) -> sin6_addr); } int main (void) { int sockfd; int new_fd; struct addrinfo hints; struct addrinfo * serverinfo; struct addrinfo * p; struct sockaddr_storage client_addr; socklen_t addrsize; struct sigaction sa; int yes = 1; char s [INET6_ADDRSTRLEN]; статус int; memset (& hints, 0, sizeof hints); // делает структуру пустой hints.ai_family = AF_UNSPEC; // IPv4 или v6 hints.ai_socktype = SOCK_STREAM; // Нужен тип TCP hints.ai_flags = AI_PASSIVE; // Заполните IP для нас // если не получается получить информацию об ошибке адреса if ((status = getaddrinfo (NULL, PORT, & hints, & serverinfo))! = 0) { fprintf (stderr, "getaddrinfo:% s \ n", gai_strerror (status)); возврат 1; } for (p = serverinfo; p! = NULL; p = p-> ai_next) { if ((sockfd = socket (p-> ai_family, p-> ai_socktype, p-> ai_protocol)) == -1) { perror ("сервер: сокет"); Продолжить; } if (setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR и & yes, sizeof (int)) == -1) { PError ( "setsockopt"); выход (1); } if (bind (sockfd, p-> ai_addr, p-> ai_addrlen) == -1) { близко (sockfd); perror ("server: bind"); Продолжить; } перерыв; } freeaddrinfo (serverinfo); if (p == NULL) { fprintf (stderr, "сервер: не удалось связать \ n"); выход (1); } if (listen (sockfd, BACKLOG) == -1) { PError ( "слушать"); выход (1); } sa.sa_handler = sigchld_handler; // пожинаем все мертвые процессы sigemptyset (& sa.sa_mask); sa.sa_flags = SA_RESTART; if (sigaction (SIGCHLD, & sa, NULL) == -1) { PError ( "sigaction"); выход (1); } printf ("сервер: ожидание соединений .... \ n"); в то время как (1) { addrsize = sizeof client_addr; new_fd = accept (sockfd, (struct sockaddr *) & client_addr, & addrsize); if (new_fd == -1) { perror («Не принимал»); Продолжить; } inet_ntop (client_addr.ss_family, get_in_addr ((struct sockaddr *) & client_addr), s, sizeof s); printf ("сервер: получено соединение от% s \ n", s); если (! вилка ()) { близко (sockfd); int bufsize = 1024; char * buffer = malloc (bufsize); recv (new_fd, buffer, bufsize, 0); запись (new_fd, «HTTP / 1.1 200 OK \ n», 16); write (new_fd, "Content-length: 46 \ n", 19); write (new_fd, "Content-type: text / html \ n \ n", 25); write (new_fd, " \ n Веб-страница \ n \ n ", 46); if (send (new_fd, header, MAXLEN, 0) == -1) PError ( "отправить"); близко (new_fd); Выход (0); } близко (new_fd); } вернуть 0; }

1 Ответ

1 голос
/ 07 мая 2019

Вам необходимо добавить заголовки ответа, например, такие:

enter image description here

, например, заголовок ответа, отправляемый SO для этой страницы:

HTTP/2.0 200 OK
cache-control: private
content-type: text/html; charset=utf-8
content-encoding: gzip
x-frame-options: SAMEORIGIN
x-request-guid: 599a5768-3cc6-4b94-86e1-e1d1daa8acd5
strict-transport-security: max-age=15552000
content-security-policy: upgrade-insecure-requests
accept-ranges: bytes
date: Tue, 07 May 2019 13:17:15 GMT
via: 1.1 varnish
x-served-by: cache-lcy19237-LCY
x-cache: MISS
x-cache-hits: 0
x-timer: S1557235035.073229,VS0,VE89
vary: Accept-Encoding,Fastly-SSL
x-dns-prefetch-control: off
content-length: 35669
X-Firefox-Spdy: h2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...