我们来详细讲解如何用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程序需要满足以下要求:
-
可执行。必须是可执行文件或可执行脚本。
-
需要按照一定格式和协议接受数据。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;
}
```
- 需要按照指定的格式输出数据。需要将CGI结果输出到标准输出,包括头信息和正文内容,例如:
```
Content-Type:text/html
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技术站