ubuntu下boa服务器编译运行

一.下载boa源码并解压

官网网站:BOA源码

点击箭头所指的位置即可下载

解压:

tar -xvf boa-0.94.13.tar.gz

解压完成得到目录:

二.安装环境所缺依赖,否则编译会报错

sudo apt install bison
sudo apt install flex 

三.编译

1.生成Makefile

/boa-0.94.13/src$ ./configure 

2.在src,执行make

and@and-VirtualBox:~/linux网络编程/boa/boa-0.94.13/src$ make
bison -y  -d boa_grammar.y
gcc  -g -O2 -pipe -Wall -I.   -c -o y.tab.o y.tab.c
y.tab.c: In function ‘yyparse’:
y.tab.c:1191:16: warning: implicit declaration of function ‘yylex’ [-Wimplicit-function-declaration]yychar = yylex ();

会编译报错:

解决:

在src/compat.h文件120行

#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff改为#define TIMEZONE_OFFSET(foo) foo->tm_gmtoff

编译完成会在src下面生成可执行文件boa

运行boa,出现报错

解决:创建/etc/boa目录
关于该目录的定义在 defines.h中。

继续运行,又报错

解决:

拷贝boa-0.94.13/boa.conf文件到/etc/boa目录下。

继续运行,又报错

注释掉:在src/log.c 72-74行

 if (dup2(error_log, STDERR_FILENO) == -1) {DIE("unable to dup2 the error log");}

又一个报错

解决:

AccessLog /var/log/boa/access_log
改为
#AccessLog /var/log/boa/access_log

发现改了也不行,后面把boa.conf cp到了etc/boa/下面进行了替换就OK了

修改url路劲

当前编译环境OK,需要修改boa.conf文件,因为我们输入url的时候,会在对应的路劲下面去找,如果路劲不对,就会找不到,页面出现404

在我的虚拟机下面,我放了如下文件

在boa.conf做如下修改

111行

DocumentRoot /home/and/www

最后一行

ScriptAlias /cgi-bin/ /home/and/www/cgi-bin/

其中/cgi-bin/指的就是当我们访问的文件带有cgi-bin字段的时候,就表示动态网页信息,因此我们的服务器,就会从后面的路劲/home/and/www/cgi-bin/下面去寻找此文件。

注意:这里的路劲使用绝对路径,否则出现找不到的情况。还有/cgi-bin/最后面的/一定不能缺少,不然还是找不到。

四.运行效果:

看一下进程运行情况

ps -a | grep "boa"

在index.html

<html><head><title>table</title><meta charset="UTF-8"></head><body>选择你的车型:<select><option>BMW</option><option>玛莎拉蒂</option><option>火车</option><option selected>宝骏</option><option>自行车</option></select></body>
</html>

效果如下:

在pass.html输入如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>用户登陆验证</title>
</head>
<body>
<form name="form1" action="/cgi-bin/pass.cgi" method="POST">
<table align="center"><tr><td align="center" colspan="2"></td></tr><tr><td align="right">用户名</td><td><input type="text" name="Username"></td></tr><tr><td align="right">密  码</td><td><input type="password" name="Password"></td></tr><tr><td><input type="submit" value="登  录"></td><td><input type="reset" value="取  消"></td></tr>
</table>
</form>
</body>
</html>

在pass.c输入如下:

/*=====================================================================
cgi例子
=====================================================================*/
//pass.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>char* getcgidata(FILE* fp, char* requestmethod);int main(void)
{char *input;char *req_method;char name[64];char pass[64];int i = 0;int j = 0;//     printf("Content-type: text/plain; charset=iso-8859-1\n\n");printf("Content-type: text/html\n\n");printf("The following is query reuslt:<br><br>");req_method = getenv("REQUEST_METHOD");input = getcgidata(stdin, req_method);// 我们获取的input字符串可能像如下的形式// Username="admin"&Password="aaaaa"// 其中"Username="和"&Password="都是固定的// 而"admin"和"aaaaa"都是变化的,也是我们要获取的// 前面9个字符是UserName=// 在"UserName="和"&"之间的是我们要取出来的用户名for ( i = 9; i < (int)strlen(input); i++ ){if ( input[i] == '&' ){name[j] = '\0';break;}                  name[j++] = input[i];}// 前面9个字符 + "&Password="10个字符 + Username的字符数// 是我们不要的,故省略掉,不拷贝for ( i = 19 + strlen(name), j = 0; i < (int)strlen(input); i++ ){pass[j++] = input[i];}pass[j] = '\0';printf("Your Username is %s<br>Your Password is %s<br> \n", name, pass);return 0;
}char* getcgidata(FILE* fp, char* requestmethod)
{char* input;int len;int size = 1024;int i = 0;if (!strcmp(requestmethod, "GET")){input = getenv("QUERY_STRING");return input;}else if (!strcmp(requestmethod, "POST")){len = atoi(getenv("CONTENT_LENGTH"));input = (char*)malloc(sizeof(char)*(size + 1));if (len == 0){input[0] = '\0';return input;}while(1){input[i] = (char)fgetc(fp);if (i == size){input[i+1] = '\0';return input;}--len;if (feof(fp) || (!(len))){i++;input[i] = '\0';return input;}i++;         }}return NULL;
}

编译为pass.cgi

编译 gcc pass.c -o pass.cgi 并赋予权限,一般我都是直接拉满 chnod 777 pass.cgi

运行效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/637720.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web前端框架/库/工具

前言 前端从步枪&#xff08;原生js&#xff09;到了半自动武器&#xff08;jQuery&#xff09;并进化为全自动武器&#xff08;三大框架&#xff08;angular&#xff0c;react&#xff0c;vue及其生态链&#xff09;&#xff09;。 常说工欲善其事必先利其器。对于那些想要提…

立创·实战派ESP32-C3开发板 with lv_micropython

一、lv_micropython对驱动芯片的支持 ESP32-C3开发板的Display drivers:ST7789&#xff0c;Input drivers:FT6336&#xff0c;从LVGL的官方文档了解到lv_micropython包含了这两颗IC的驱动。 参考文档&#xff1a; lv_micropython already contains these drivers: 链接:Micro…

如何在一台服务器上同时运行搭载JDK 8, JDK 17, 和 JDK 21的项目:终极指南

&#x1f42f; 如何在一台服务器上同时运行搭载JDK 8, JDK 17, 和 JDK 21的项目&#xff1a;终极指南 &#x1f680; 摘要 在企业开发环境中&#xff0c;常常需要在同一台服务器上运行使用不同Java开发工具包&#xff08;JDK&#xff09;版本的多个项目。本文详细介绍如何在L…

uni-app 如何添加模拟器

uni-app 如何添加模拟器 使用微信开发者工具运行微信小程序使用 HBuilderX 内置模拟器使用第三方 Android 模拟器 下载并安装&#xff1a;配置环境&#xff1a;连接模拟器&#xff1a; 总结 有哪些可以使用的安卓模拟器软件 uni-app 如何添加模拟器 Uni-App 是一个基于 Vue.js…

Golang那些违背直觉的编程陷阱

目录 知识点1&#xff1a;切片拷贝之后都是同一个元素 知识点2&#xff1a;方法集合决定接口实现&#xff0c;类型方法集合是接口方法集合的超集则认定为实现接口&#xff0c;否则未实现接口 切片拷贝之后都是同一个元素 package mainimport ("encoding/json"&quo…

Redis入门到通关之数据结构解析-Dict

文章目录 概述构成Dict的扩容Dict的rehash总结 概述 我们知道Redis是一个键值型&#xff08;Key-Value Pair&#xff09;的数据库&#xff0c;我们可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。 Dict由三部分组成&#xff0c;分别是&#xff1a;哈…

从头开始构建自己的 GPT 大型语言模型

图片来源&#xff1a; Tatev Aslanyan 一、说明 我们将使用 PyTorch 从头开始构建生成式 AI、大型语言模型——包括嵌入、位置编码、多头自注意、残差连接、层归一化&#xff0c;Baby GPT 是一个探索性项目&#xff0c;旨在逐步构建类似 GPT 的语言模型。在这个项目中&#xff…

Microchip 32位MCU CAN驱动图文教程-附源码

文章目录 创建一个新的32位MCU工程Microchip MCC Harmony配置界面说明在MCC下配置系统的时钟在MCC下配置所需要使用的模块配置调试打印模块配置CAN模块配置管脚功能修改系统堆栈大小生成代码 添加用户代码 创建一个新的32位MCU工程 确保电脑上已经安装最新的MPlab X IDE、XC32编…

C# WPF布局

布局&#xff1a; 1、Grid: <Window x:Class"WpfApp2.MainWindow" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d"http://schemas.microsoft.com…

matplotlib从起点出发(15)_Tutorial_15_blitting

0 位图传输技术与快速渲染 Blitting&#xff0c;即位图传输、块传输技术是栅格图形化中的标准技术。在Matplotlib的上下文中&#xff0c;该技术可用于&#xff08;大幅度&#xff09;提高交互式图形的性能。例如&#xff0c;动画和小部件模块在内部使用位图传输。在这里&#…

Drive Scope for Mac:硬盘健康监测分析工具

Drive Scope for Mac是一款专为Mac用户设计的硬盘健康监测与分析工具&#xff0c;致力于保障用户的数据安全。这款软件功能强大且操作简便&#xff0c;能够实时检测硬盘的各项指标&#xff0c;帮助用户及时发现并解决潜在问题。 Drive Scope for Mac 1.2.23注册激活版下载 Driv…

智慧化转型赋能园区创新:科技创新引领产业智慧化,打造高效发展新格局

在全球化和信息化浪潮的推动下&#xff0c;园区作为区域经济发展的重要引擎&#xff0c;正面临着前所未有的机遇与挑战。为应对这些挑战并把握机遇&#xff0c;园区需积极拥抱智慧化转型&#xff0c;通过科技创新引领产业智慧化&#xff0c;打造高效发展的新格局。本文将深入探…