如何用C写一个web服务器之CGI协议

我们来详细讲解如何用C写一个Web服务器并支持CGI协议。

什么是CGI协议?

CGI(通用网关接口)是一种标准,定义了外部程序和Web服务器之间的接口规范。通过CGI程序,Web服务器可以调用位于其它服务器上的应用程序或资源。

编写CGI程序的步骤

1.确定Web服务器的CGI目录。通常默认为cgi-bin目录,如果不知道可以查看服务器配置文件。

2.在CGI目录下创建可执行文件,例如hello.cgi。

3.编写CGI程序,必须符合一定的规范。

4.将CGI程序拷贝到Web服务器的CGI目录中。

5.使用Web服务器支持的编程语言编写对应的Web页面,发起CGI请求,将CGI程序与Web页面链接起来。

编写CGI程序的注意事项

CGI程序需要满足以下要求:

  1. 可执行。必须是可执行文件或可执行脚本。

  2. 需要按照一定格式和协议接受数据。CGI程序需要按照指定的格式从Web服务器中获取数据,例如GET或POST请求中的参数。例如:

```c
#include
#include
#include

int main()
{
char method = NULL;
char
query_string = NULL;
char content_length = NULL;
char
post_data = NULL;

   // 从环境变量中获取相关数据
   method = getenv("REQUEST_METHOD");
   query_string = getenv("QUERY_STRING");
   content_length = getenv("CONTENT_LENGTH");

   // 根据不同类型获取数据
   if (strcmp(method, "POST") == 0)
   {
       int len = atoi(content_length);
       post_data = malloc(len + 1);
       fread(post_data, 1, len, stdin);
       post_data[len] = '\0';
   }

   // 输出CGI程序的结果
   printf("Content-Type:text/html\n\n");
   printf("<html>\n<head><title>Hello CGI</title></head>\n<body>\n");
   printf("<h1>Hello CGI</h1>\n");
   printf("<p>QUERY_STRING:%s</p>\n", query_string);
   if (post_data)
   {
       printf("<p>POST_DATA:%s</p>\n", post_data);
       free(post_data);
   }
   printf("</body>\n</html>\n");

   return 0;

}
```

  1. 需要按照指定的格式输出数据。需要将CGI结果输出到标准输出,包括头信息和正文内容,例如:

```
Content-Type:text/html


Hello CGI

Hello CGI

QUERY_STRING:


```

示例1

以下是一个简单的示例,通过CGI输出表单数据:

Web页面代码:

<html>
<head>
    <title>CGI demo</title>
</head>
<body>
    <form method="post" action="http://localhost/cgi-bin/form.cgi">
        <p>name:<input type="text" name="name"></p>
        <p>email:<input type="text" name="email"></p>
        <p><input type="submit" value="submit"></p>
    </form>
</body>
</html>

CGI程序代码(form.cgi):

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
    char* method = NULL;
    char* query_string = NULL;
    char* content_length = NULL;
    char* post_data = NULL;

    // 从环境变量中获取相关数据
    method = getenv("REQUEST_METHOD");
    query_string = getenv("QUERY_STRING");
    content_length = getenv("CONTENT_LENGTH");

    // 根据不同类型获取数据
    if (strcmp(method, "POST") == 0)
    {
        int len = atoi(content_length);
        post_data = malloc(len + 1);
        fread(post_data, 1, len, stdin);
        post_data[len] = '\0';
    }

    // 输出CGI程序的结果
    printf("Content-Type:text/html\n\n");
    printf("<html>\n<head><title>Form Result</title></head>\n<body>\n");
    printf("<h1>Form Result</h1>\n");
    printf("<p>Query String:%s</p>\n<p>Post Data:%s</p>\n", query_string, post_data?post_data:"");
    printf("</body>\n</html>\n");

    return 0;
}

在浏览器中访问Web页面,填写表单数据,点击提交按钮,就可以看到CGI程序的结果。

示例2

以下是一个简单的示例,通过CGI输出用户信息。

Web页面代码:

<html>
<head>
    <title>User Info</title>
</head>
<body>
    <form method="post" action="http://localhost/cgi-bin/user.cgi">
        <p>name:<input type="text" name="name"></p>
        <p>age:<input type="text" name="age"></p>
        <p><input type="submit" value="submit"></p>
    </form>
</body>
</html>

CGI程序代码(user.cgi):

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
    char* method = NULL;
    char* query_string = NULL;
    char* content_length = NULL;
    char* post_data = NULL;

    // 从环境变量中获取相关数据
    method = getenv("REQUEST_METHOD");
    query_string = getenv("QUERY_STRING");
    content_length = getenv("CONTENT_LENGTH");

    // 根据不同类型获取数据
    if (strcmp(method, "POST") == 0)
    {
        int len = atoi(content_length);
        post_data = malloc(len + 1);
        fread(post_data, 1, len, stdin);
        post_data[len] = '\0';
    }

    // 输出CGI程序的结果
    printf("Content-Type:text/html\n\n");
    printf("<html>\n<head><title>User Info</title></head>\n<body>\n");
    printf("<h1>User Info</h1>\n");
    printf("<p>Query String:%s</p>\n<p>Post Data:%s</p>\n", query_string, post_data?post_data:"");

    // 解析POST数据并输出
    if (post_data)
    {
        char* p = strstr(post_data, "name=");
        if (p)
        {
            p += strlen("name=");

            char* q = strchr(p, '&');
            if (q)
            {
                *q = '\0';
            }

            printf("<p>name:%s</p>\n", p);
        }

        p = strstr(post_data, "age=");
        if (p)
        {
            p += strlen("age=");

            char* q = strchr(p, '&');
            if (q)
            {
                *q = '\0';
            }

            printf("<p>age:%s</p>\n", p);
        }

        free(post_data);
    }

    printf("</body>\n</html>\n");

    return 0;
}

在浏览器中访问Web页面,填写用户信息,点击提交按钮,就可以看到CGI程序的结果。

以上就是用C语言编写Web服务器并支持CGI协议的完整攻略,希望对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何用C写一个web服务器之CGI协议 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言实现学生学籍管理系统程序设计

    C语言实现学生学籍管理系统程序设计 前言 学生学籍管理系统是一款常见的管理软件,它主要用于记录学生的个人信息和学习情况,方便教师和学校管理。C语言是一种常用的计算机编程语言,可以用来编写各种各样的软件,包括学生学籍管理系统。 设计思路 学生学籍管理系统主要包括学生信息和成绩管理两个部分。我们可以采用结构体来存储学生的信息,采用数组来存储学生成绩。具体的设计思…

    C 2023年5月23日
    00
  • Go语言的JSON处理详解

    Go语言的JSON处理详解 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人们阅读和编写,同时也易于机器解析和生成。JSON是JavaScript原生支持的数据格式,因此可以被广泛应用于AJAX技术,通过HTTP请求发送JSON数据,实现网页与服务器之间的数据交互。 Go语言中的JSON Go…

    C 2023年5月23日
    00
  • C#如何调用原生C++ COM对象详解

    C#如何调用原生C++ COM对象详解 什么是COM对象 COM(Component Object Model)是一种微软开发的组件对象模型,用于实现不同程序间的互操作性,特别是OLE(Object Linking and Embedding)。 如何调用原生C++ COM对象 使用C#语言调用原生C++ COM对象需要引用InteropServices命名…

    C 2023年5月22日
    00
  • 如何用C语言画一个“圣诞树”

    下面是如何用C语言画一个圣诞树的攻略: 步骤一:准备工作 新建一个C语言文件,例如“christmas_tree.c”; 导入所需的头文件; 示例代码: #include<stdio.h> #include<windows.h> 步骤二:绘制圣诞树的主体 定义圣诞树的高度和底部宽度,例如height和width; 循环绘制每一行的叶子…

    C 2023年5月23日
    00
  • C++处理图存储的方式分享

    C++处理图存储的方式分享 在C++中处理图的存储方式有多种,这里主要讲解三种最常见和实用的方式:邻接矩阵、邻接表和关联数组。 邻接矩阵 邻接矩阵是图最简单、使用最广泛的存储方式之一,它使用一个二维矩阵表示节点之间的关系。当图中有 n 个节点时,可以用一个 n x n 的矩阵来存储它们之间的关系,矩阵中的每个元素存储两个节点之间的边的信息,如边的权重。 以下…

    C 2023年5月23日
    00
  • 使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇

    关于“使用jQuery向ASP.NET MVC传递复杂JSON数据-ModelBinder篇”的完整攻略可以分为以下几个步骤: 1. 创建MVC项目 在开始使用jQuery向ASP.NET MVC传递复杂JSON数据-ModelBinder篇的攻略前,首先需要创建一个MVC项目,可以使用Visual Studio创建。在创建MVC项目时需要选择ASP.NET…

    C 2023年5月23日
    00
  • C++Smart Pointer 智能指针详解

    C++ Smart Pointer 智能指针详解 1. 什么是智能指针? 智能指针是一个用于指针管理的封装类,它能够自动释放内存。相比于简单的指针,智能指针能更好地控制对象的生命周期,避免一些常见的bug,如内存泄露和野指针。 2. 常见的智能指针类型 C++中常见的智能指针类型有三种: 2.1. unique_ptr unique_ptr是C++11标准中…

    C 2023年5月22日
    00
  • json.stringify()与json.parse()的区别以及用处

    JSON在现代Web应用程序开发过程中扮演着非常重要的角色。它是一种数据格式,用来交换数据,而且被广泛使用。JS开发者通常需要将JS对象转换为JSON格式,然后将其发送到服务器或者持久性存储,JSON也会从服务器返回,然后被转换为JS对象。这个过程需要使用JSON.stringify()和JSON.parse()这两个方法来进行。 JSON.stringif…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部