服务器显示文本而不是 HTML

2024-04-04

我正在尝试创建一个 C 服务器,它将接受输入并能够通过 html 格式将它们返回给用户,其中服务器充当用户界面。我当前的问题似乎无法弄清楚为什么 C 服务器在 localhost:3838 处将 HTML 代码以文本形式吐出,而不是将其显示为正确的网页。

我该如何解决这个问题并让它能够将用户命令发送回服务器并发出正确的响应?我是否使用以下方法来做到这一点recieve然后将消息放入缓冲区,解析该消息,然后将该响应放入缓冲区以使用send?

CSERVER.c

#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.</pre>\n\n"
"<p>Standard Output:</p>\n""<pre>Your server will include the stdout results here.</pre>\n\n"
"<p>Standard Error:</p>\n"
"<pre>Your server will include the stderr results here.</pre>\n\n"
"</body>\n""</html>";

char *buff = header; 

void sigchld_handler(int s)
{
    (void)s; // quiet unused variable warning

    // waitpid() might overwrite errno, so we save and restore it:
    int saved_errno = errno;

    while(waitpid(-1, NULL, WNOHANG) > 0);

    errno = saved_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 status;

    memset(&hints, 0, sizeof hints); //makes struct empty 
    hints.ai_family = AF_UNSPEC; //IPv4 or v6 
    hints.ai_socktype = SOCK_STREAM; //TCP type need 
    hints.ai_flags = AI_PASSIVE; //Fill in IP for us 


    //if can't get address info print error 
    if((status = getaddrinfo(NULL, PORT, &hints, &serverinfo)) != 0){
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
        return 1;
    }


    for(p = serverinfo; p != NULL; p = p->ai_next){
        if((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1){
            perror("server: socket");
            continue;
        }

        if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1){
            perror("setsockopt");
            exit(1);
        }

        if(bind(sockfd, p->ai_addr, p->ai_addrlen) == -1){
            close(sockfd);
            perror("server: bind");
            continue;
        }

        break;
    }

    freeaddrinfo(serverinfo);

    if(p == NULL){
        fprintf(stderr, "server: failed to bind\n");
        exit(1);
    }

    if(listen(sockfd, BACKLOG) == -1){
        perror("listen");
        exit(1);
    }

    sa.sa_handler = sigchld_handler; // reap all dead processes
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_RESTART;
    if (sigaction(SIGCHLD, &sa, NULL) == -1) {
        perror("sigaction");
        exit(1);
    }

    printf("server: waiting for connections....\n");

    while(1){
        addrsize = sizeof client_addr;
        new_fd = accept(sockfd, (struct sockaddr *)&client_addr, &addrsize);
        if(new_fd == -1){
            perror("Did not accept");
            continue;
        }

        inet_ntop(client_addr.ss_family, get_in_addr((struct sockaddr *)&client_addr), s, sizeof s);
        printf("server: got connection from %s\n", s);

        if(!fork()){
            close(sockfd);
int bufsize = 1024;
char *buffer = malloc(bufsize);
recv(new_fd, buffer, bufsize, 0);
write(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, "<html><head>\n<title>The Web Page</title>\n</head>\n</html>", 46);
            if(send(new_fd, header, MAXLEN, 0) == -1)
                perror("send");
            close(new_fd);
            exit(0);
        }
        close(new_fd);
    }

    return 0;


}

您需要添加如下响应标头:

例如,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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

服务器显示文本而不是 HTML 的相关文章

随机推荐

  • 有没有办法在 Jenkins 构建队列小部件中显示更多信息?

    在詹金斯状态页面上 我们有以下小部件 它显示 主 作业挂起 5 次 这是合理的 因为每次将代码审查推送到 Gerrit 时 它都会触发该分支上的这些更改的作业 如果我将鼠标悬停在这些 主 链接上 我可以看到环境中的许多有用信息 例如 GER
  • Android Oreo 位置通过 JobIntentService 在后台更新

    我曾经有AlarmManager WakefulBroadcastReceiver 服务做一些后台代码并获取位置更新 从奥利奥开始 这已被弃用 所以现在我使用AlarmManager BroadcastReceiver JobIntentS
  • main() 是 C 中的预定义函数吗? [复制]

    这个问题在这里已经有答案了 可能的重复 C C Java C 中的 main https stackoverflow com questions 1539385 main in c c java c 总的来说 我对编程很陌生 尤其是 C 我
  • 如何以编程方式调用 Maven 依赖插件

    我正在尝试以编程方式调用 maven dependency plugin 我正在使用 Maven 3 版本 问题是 当我通过pluginManager executeMojo session execution 调用它时 我收到以下错误消息
  • 使用 json.net 反序列化静态属性?

    大家好 我有一个如下所示的 JSON totals tokenType string tokenDenomination double count int IDCode string Key string 反序列化为对象的 C 代码是 in
  • 使用 WooCommerce 中的挂钩更新产品价格

    我正在尝试使用元键更新产品正常价格 regular price当产品在 wp admin 中更新时 使用整数或字符串 我想要的用户流程是 打开产品编辑页面 单击更新按钮 页面重新加载后 请看到 regular price 设置为 20 ad
  • 无法从 Windows 调试 Web 应用程序中的 iOS 问题?

    我在 iPad Pro 和 iPhone 7 Plus 上测试 Web 应用程序时发现了一些错误 我无法使用 Windows 或 Android 中的任何浏览器复制这些错误 并且找不到任何在 Windows 中远程调试 Safari 的方法
  • 如何迭代 C# 类查找特定类型的所有实例,然后在每个实例上调用方法

    是否可以 通过反射 迭代对象的所有字段 并在每个字段上调用一个方法 我有一堂课是这样的 public class Overlay public Control control1 public Control control2 我想要一个像这
  • 自动映射器表达式必须解析为顶级成员

    我正在使用自动映射器来映射源对象和目标对象 当我映射它们时 我收到以下错误 表达式必须解析为顶级成员 参数名称 lambda表达式 我无法解决这个问题 我的源对象和目标对象是 public partial class Source priv
  • C 删除文件最后 n 个字符

    我需要使用 C 代码从文件中删除最后 n 个字符 起初我尝试使用 b 但它返回了分段错误 我看到类似问题的有趣答案here https stackoverflow com questions 584639 truncate file and
  • 把按钮做成圆形

    我正在尝试在 150 210 的 x y 坐标处制作 JButton 圆 我希望按钮是大小为 40 40 的椭圆形 按钮的背景颜色为红色 它不需要文本 所以我应该得到一个我想要的任何大小的按钮 对吗 我正在使用面板 并将 setLayout
  • jQuery Mobile 通过 ajax 动态创建可折叠集不应用样式[重复]

    这个问题在这里已经有答案了 可能的重复 动态添加可折叠元素 https stackoverflow com questions 4214538 dynamically adding collapsible elements 我正在动态创建一
  • 为什么是“unsigned int ui = {-1};”缩小转换误差?

    标准第 8 5 4 7 解释了什么是缩小转换范围 is 缩小转换是隐式转换 从浮点类型到整数类型 或者 从 long double 到 double 或 float 或者从 double 到 float 除非源是常量 表达式与转换后的实际值
  • DatePicker Blackout日期所有未来和一些过去

    我有一个 WPF 应用程序 需要使用 DatePicker 提供出生日期 除了 134 年前以及之后的所有时间之外 我还想删除明天和其余时间的日期 我尝试使用 BlackoutDates 来完成此任务 因为我们仍然希望允许手动用户输入 但我
  • 使用 Curl 发布 xml 时权限被拒绝?

    我必须将 xml 发布到某个 url 以便由某些 Web 服务使用 我正在使用 Cent OS 5 6 Apache 2 2 3 CentOS 当我使用命令行发布时curl d abc xml http example com它给了我结果
  • 使用 appium 自动登录过程时,密码和用户名被输入在用户名的同一字段中

    尽管测试清晰简单 但我在尝试发送密钥 用户名 密码 时总是面临同样的问题 但密码字段是写在用户名的位置 这是我的测试 NG 我使用 appium 进行测试 Test public void Test1 throws InterruptedE
  • 将 iOS 和 Android 客户端连接到 SockJS 后端

    我正在使用开发 WebSocket 消息传递后端Spring WebSockets https spring io guides gs messaging stomp websocket 它使用SockJS STOMP协议 之所以不使用普通
  • 通过 SSO 进行 Maven 设置?

    我有一些开发人员对于将 LDAP 用户名 密码存储在 settings xml 中以便访问 Nexus 感到不满意 他们的不满部分是出于 FUD 但也因为每当 LDAP 密码过期时都必须重新加密密码 这种情况在此处相对常见 带来的不便 有什
  • Airflow:只有一项任务的简单 DAG 永远不会完成

    我制作了一个非常简单的 DAG 如下所示 from datetime import datetime from airflow import DAG from airflow operators bash operator import B
  • 服务器显示文本而不是 HTML

    我正在尝试创建一个 C 服务器 它将接受输入并能够通过 html 格式将它们返回给用户 其中服务器充当用户界面 我当前的问题似乎无法弄清楚为什么 C 服务器在 localhost 3838 处将 HTML 代码以文本形式吐出 而不是将其显示