BOA服务器移植

news2025/1/11 6:56:31

BOA服务器移植

1、源码下载

http://www.boa.org/
News! (last updated 23 February 2005)
Latest Released Version (0.94.13) here (signature here)  --- 下载地址

1.1 boa简介:

其可执行代码只有大约60KB左右,Boa是一个单任务的HTTP服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。Boa支持CGI。
Boa的设计目标是速度和安全。(CGI只是一个进程,用来提供接口),自动目录生成和自动文件枪支进行拼接。
Boa的主要设计目标是速度和安全性。安全性在“不能被恶意用户破坏”的意义上,不是“细粒度访问控制和加密通信”。

特点:可靠性和可移植性,Boa不是作为功能强大的服务器。
开发平台:GNU / Linux是目前的开发平台。
推荐:GoAhead Apache2

跨平台移植三部曲:

1、./configure生成一个Makefile      ./configure  --prefix   --host
2、make 
3、make install 

2、解压源码:
tar -xvf boa-0.94.13.tar.gz
3、进入源码目录下的src目录:

cd boa-0.94.13/src/

在源码目录下配置与编译。执行

./configure

这是根据configure.in文件进行一系列的配置,生成config.status,configure,和Makefile文件。
如果无法执行,考虑权限,修改该目录下的configure的属性为可执行 chmod 755 configure

安装新包之前最好先更新一下包

sudo apt-get update
sudo apt-get -f install
sudo apt-get install pack

4、make 编译源码:

问题1: 
目录: boa-0.94.13/src$ make
	yacc  -d boa_grammar.y
	make: yacc: Command not found
	make: *** [y.tab.c] Error 127
解决方法:
	/boa-0.94.13/src$ sudo apt-get install bison
问题2: 
	yacc  -d boa_grammar.y
	gcc  -g -O2 -pipe -Wall -I.   -c -o y.tab.o y.tab.c
	......
	lex  boa_lexer.l
	make: lex: Command not found
	make: *** [lex.yy.c] Error 127
解决方法:
	/boa-0.94.13/src$ sudo  apt-get install flex
WARNING: The following packages cannot be authenticated!
  libfl-dev flex
Install these packages without verification? [y/N] 
E: Some packages could not be authenticated
注意加参数-f 自动搜索依赖,下面选择y  : sudo  apt-get install flex -f
Do you want to continue? [Y/n] y
WARNING: The following packages cannot be authenticated!
  libfl-dev flex
Install these packages without verification? [y/N] y

问题3: 	
util.c: In function ‘get_commonlog_time’:
util.c:100:39: error: pasting "t" and "->" does not give a valid preprocessing token
		 time_offset = TIMEZONE_OFFSET(t);									   ^
compat.h:120:30: note: in definition of macro ‘TIMEZONE_OFFSET’
 #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff						  ^
make: *** [util.o] Error 1

问题描述:在compat.h文件中的宏定义问题: ‘TIMEZONE_OFFSET’
解决方法:
修改 boa-0.94.13/src$ vi compat.h +120
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

	将boa.c中的 vi   boa.c
	225     #if 0     //注释掉
	226         if (setuid(0) != -1) {
	227             DIE("icky Linux kernel bug!");
	228         }
	229     #endif             

这三行注释掉,否则boa启动时会出现“boa.c:226 - icky linux kernel bug!: No suchfile or directory错误”

清除之前编译的内容 make clean (防止某些依赖的信息出现问题)
重新make
再次boa-0.94.13/src$ make
make: Nothing to be done for `all’.
make主要检查的是时间戳, 只要target比依赖的文件时间靠后它就认为不需要编译

5.建立安装目录

sudo mkdir -p 	/boa 	/boa/www 	/boa/cgi-bin 	/boa/log  
将src/defines.h中的
	 #define SERVER_ROOT "/etc/boa" 
	 修改为
#define SERVER_ROOT "/boa"

(这样boa程序启动时会在/boa目录下寻找boa.conf配置文件,并且将/boa文件夹作为服务器的根目录)。
将需要的文件复制到安装目录中
将boa-0.94.13/src目录下生成的boa、boa_indexer二进制文件复制到/boa下
sudo cp boa boa_indexer /boa
将boa-0.94.13目录下的boa.conf文件复制到/boa下
sudo cp boa.conf /boa
可选项: arm-linux-strip boa(去掉boa中的调试信息,只是减小文件的大小可以执行也可以不执行)
将/etc/mime.types复制到/boa目录下
sudo cp /etc/mime.types /boa

7、返回boa的顶层目录 — 修改配置文件
boa-0.94.13$ ls
boa.conf contrib docs extras README
ChangeLog CREDITS examples Gnu_License src

vi boa.conf, //几乎全部指定到boa的目录下,这样方便我们进行管理
重新指定一些文件的生成路径,因为重新指定这些路径后会帮助我们深刻的理解关于boa服务器的工作机制
Port 80
User 0
Group 0
bind调用的IP地址,一般注释掉,表明绑定到INADDR_ANY,通配于服务器的所有IP地址
#Listen 192.68.0.5
/##### error_log和access_log会自动生成,只要指定生成路径就可以了。
ErrorLog /boa/log/error_log
AccessLog /boa/log/access_log

存放HTML文件的根路径
DocumentRoot /boa/www  
UserDir public_html  
默认页面,若之输入http://127.0.0.1/则会自动返回给浏览器默认页面index.html
DirectoryIndex index.html    
##### 保持默认  
DirectoryMaker /boa/boa_indexer   //被修改
KeepAliveMax 1000  
KeepAliveTimeout 10  
MimeTypes /boa/mime.types   //被修改
DefaultType text/plain    
#####指定传给cgi程序的PATH环境变量  
CGIPath /bin:/usr/bin:/usr/local/bin   
#####保持默认  
Alias /doc /usr/doc   
#####如果输入http://127.0.0.1/cgi-bin/test.cgi, 则boa服务器会到/boa/cgi-bin中寻找test.cgi程序。  
ScriptAlias /cgi-bin/ /boa/cgi-bin/  

8.建立测试页面
(1)index.html ,将index.html 放在/boa/www目录下
sudo cp index.html image.jpg /boa/www


this is a test!




tree picture



to cgi page //指定了cgi可执行文件存放的路径,默认从/boa的根目录开始查找

注意: 笔记本打开,另存为utf-8格式,自己添加一张图片到当前的目录下
(2)test.c, 使用gcc -o test.cgi test.c,将test.c编译生成test.cgi,后缀为cgi的类型
编译后得到的test.cgi放在/boa/cgi-bin目录下,
sudo cp test.cgi /boa/cgi-bin/

#include <stdio.h>  
int main()  
{  
  printf("Content-type:text/html\n\n"); //这句一定要加上  
  printf("<html><body>");  
  printf("<font style=\"color:red; font-size:30px;\">Hello, CGI!</font><br/>");  
  printf("<a href=\"/index.html\">return index.html</a>");  
  printf("</body></html>");  
  return 0;  
}  

9、查看/boa目录下所有的文件:

10、测试效果
进入/boa目录,使用./boa来运行boa服务器(当然也可将/boa路径加入系统PATH环境变量,这样不用进入/boa目录,直接输入boa就可以了)
在浏览器中输入http://127.0.0.1/便可访问到默认的页面index.html,
或: http://192.168.1.200:80
http://localhostip:port
点击index.html页面中的超链接便可访问到cgi测试页面,点击test.cgi中的超链接又可返回index.html页面。
(1)index.html页面
fengjunhui@ubuntu:/boa$ ./boa
[19/Jul/2017:08:44:28 +0000] log.c:73 - unable to dup2 the error log: Bad file descriptor
解决方法:
这个问题其实就是你没有创建log文件夹,以及文件夹下的log_error和access_error文件引起的。只要在boa.conf中找到这两个文件的信息,将其路径改成自己需要的路劲,并在相应的位置创建对应文件就OK。
62 ErrorLog /boa/log/error_log
74 AccessLog /boa/log/access_log
fengjunhui@ubuntu:/boa$ ls 发现有log目录
boa boa.conf boa_indexer cgi-bin log mime.types www

问题描述
log.c:73 unable to dup2 the error log: Bad file descriptor
问题解决:
Vi log.c +73
扩展:
函数名: dup2
功能: 复制文件描述符
用法: int dup2(int oldfd,int newfd);
修改 src/log.c
注释掉
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE(“unable to dup2 the error log”);
}
为:
71 #if 0
72 /* redirect stderr to error_log */
73 if (dup2(error_log, STDERR_FILENO) == -1) {
74 DIE(“unable to dup2 the error log”);
75 }
76 #endif

/boa目录下重新执行  ./boa 执行
Cannot open /boa/log/access_log for logging: logfile open: Permission denied
出错,因为不是root用户(虚拟机),权限不够。(A9开发板默认登录为root用户,不需要加sudo)
sudo ./boa

然后再./boa  此时boa服务器就已经启动,打开ubuntu浏览器,输入ubuntu的ip地址,就可以看到你放在/var/www里的网页了。ok

测试结果:
http://127.0.0.1/index.html
this is a test!

	return to cgi page

	点击跳转: 
	Hello, CGI!
	return index.html
以上是在PC上部署BOA的大致步骤,仅供参考。	

问题描述:
fengjunhui@ubuntu:/boa$ sudo ./boa
[19/Jul/2017:13:44:11 +0000] boa.c:194 - unable to bind: Address already in use

如何关闭boa服务器:
fengjunhui@ubuntu:~$ ps -axj | grep “boa”
2102 24862 24860 24255 pts/18 24255 S 65534 0:00 ./boa
2102 25735 25733 24255 pts/18 24255 S 65534 0:00 ./boa
25753 25793 25792 25753 pts/4 25792 S+ 1000 0:00 grep --color=auto boa

kill -9 pid(boa)
fengjunhui@ubuntu:~$ sudo kill -9 24862
fengjunhui@ubuntu:~$ sudo kill -9 25733

重新启动boa,再次通过浏览器访问cgi,访问成功!

fengjunhui@ubuntu:~/Boa-0.94/boa-0.94.13/src$ sudo cp boa_indexer boa /boa 
cp: cannot create regular file ‘/boa/boa’: Text file busy
cp并不改变目标文件的inode,事实上它的实现是这样的:
# strace cp test2 test 2&1 | grep open.*test
open("test2", O_RDONLY|O_LARGEFILE) = 3
Linux由于Demand Paging机制的关系,必须确保正在运行中的程序镜像(注意,并非文件本身)不被意外修改,

因此内核在启动程序后会锁定这个程序镜像的inode。这就是为什么cp在用“O_WRONLYO_TRUNC”模式open目标文件时会失败。
而先rm再cp的话,新文件的inode其实已经改变了,原inode并没有被真正删除,直到内核释放对它的引用。
fengjunhui@ubuntu:/boa$ sudo rm boa
sudo cp boa_indexer boa /boa

扩展部分:

11、移植到A9开发板上:
(注意修改源码,具体的现象可以参考视频,遇到问题推荐自己通过百度解决问题,会查资料也是一种能力)
(1)移植boa到嵌入式linux上的方法和上面几乎一样,具体做法是\在
./configure
生成Makefile后将Makefile中的
CC = gcc CPP=gcc -E
改为
CC = arm-linux-gcc,
CPP = arm-linux-gcc -E,
然后make就可以了。
(2)重新拷贝修改后的文件:
将boa-0.94.13/src目录下生成的boa、boa_indexer二进制文件复制到/boa下
将boa-0.04.13目录下的boa.conf文件复制到/boa下
将/etc/mime.types复制到/boa目录下
将test.cgi放在/boa/cgi-bin目录下,
将index.html image.jpg 放在/boa/www目录下

(3)拷贝文件到rootfs文件系统目录下:
cd boa 进入boa文件目录
移植到开发板后:
[root@fengjunhui boa]:~$ ./boa
No such user: nobody
解决方法:
sudo vi boa.conf
(1)Group的修改
修改 Group nogroup 为 Group 0
(2)user的修改
修改 User nobody 为 User 0

	[root@fengjunhui boa]:~$ ./boa

问题描述:
[01/Jan/1970:00:23:10 +0000] boa.c:211 - getpwuid: Success
[01/Jan/1970:00:00:39 +0000] boa.c:211 - getpwuid: No such file or directory
解决:修改src/boa.c
注释掉下面两句话:
#if 0
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
#endif

(2)移植boa到嵌入式linux后,在启动时若出现“gethostbyname:: Success	
	"然后程序退出,则需在原boa.conf文件中增加一行:
	ServerName  www.your.org.here
然后重新运行boa,然后在主机浏览器输入开发板网址(http://开发板ip:port)
[root@fengjunhui ]:~$ cd boa
[root@fengjunhui boa]:~$ ls
boa          boa_indexer  log          www
boa.conf     cgi-bin      mime.types
[root@fengjunhui boa]:~$ ./boa
[01/Jan/1970:00:00:24 +0000] boa: server version Boa/0.94.13
[01/Jan/1970:00:00:24 +0000] boa: server built Jul 19 2017 at 23:07:48.
[01/Jan/1970:00:00:24 +0000] boa: starting server pid=1185, port 80

[root@fengjunhui boa]:~$ [01/Jan/1970:00:01:30 +0000] request from 192.168.8.223 "GET /favicon.ico HTTP/1.1" ("/boa/www/favicon.ico"): document open: No such file or directory
[01/Jan/1970:00:01:30 +0000] request from 192.168.8.223 "GET /favicon.ico HTTP/1.1" ("/boa/www/favicon.ico"): document open: No such file or directory
这个问题不影响使用:

问题描述:
[01/Jan/1970:00:01:34 +0000] cgi_header: unable to find LFLF
出错位置
  cgi_procee_header()
对于错误 cgi_header: unable to find LFLF的补充

浏览器中显示502 Bad Gateway
The CGI was not CGI/1.1 compliant.
解决方法:在Ubuntu端和A9端的交叉编译环境不一样,最好链接为静态库,这样不用单独提供库的支持
<3>编译方式:arm-linux-gcc -static -o xxx.cgi  xxx.c

可能的原因:
<1>输出MIME格式错误,结尾一定要有两个换行符
	printf("Content-Type:text/html\n\n")
<2>权限错误
	chmod 777 var/www/cgi-bin/xxx.cgi
<3>编译方式:arm-linux-gcc -static -o xxx.cgi  xxx.c
<4>备用方案:代码本身错误也会引起这个问题。实践中这个问题困扰了很久,一个字符串数组的处理有了问题,	提示的错误信息却是这个,开始一直郁闷于格式和权限,也可能是调用的一个小函数有些问题而导致的。所以在遇到这个问题时,如果输出格式和权限都正确的情况下,检查代码是个很好的选择
测试:

在Ubuntu上输入你板子的ip: http://192.168.1.100/
OK ,实现了和直接在Ubuntu上操作一样的结果
输入指定的路径去访问:
http://192.168.1.100/index.html
http://192.168.1.100/pass.html 跳转访问到指定的cgi
指定是OK的。

可选项: ***----->然后给boa瘦身
arm-none-linux-gnueabi-strip boa
fengjunhui@ubuntu:~/smartstorage/boa-0.94/boa-0.94.13/src$ arm-none-linux-gnueabi-strip boa
arm-none-linux-gnueabi-strip: Unable to recognise the format of the input file `boa’
我们并没有修改Makefile,那么这个时候编译生成的x86格式的boa
fengjunhui@ubuntu:~/smartstorage/boa-0.94/boa-0.94.13/src$ file boa
boa: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=95bed4fc9481ca5ac84616c6cfb2578f4e4d1a2f, not stripped
F

错误记录:
line: 1: Syntax error: word unexpected (expecting “)”)
开发板上运行可执行程序报出错误:
line1: 1: Syntax error: word unexpected (expecting “)”)
解决思路:
1.编译器的问题
用arm-linux-gcc编译,可能原来是用gcc编译的。
假如是脚本,#!/bin/sh 改 #!/bin/bash试试。
2.文件完整性
重新烧写或上传一遍。
3.编译命令问题
比如我的一个测试程序test.c :
arm-linux-gcc -o test.o -c test.c //编译为目标文件
arm-linux-gcc -o test.o test.c //编译为可执行文件
莫听竹林打叶声,何妨吟啸且前行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。

(--------------完------------)

boa.conf 内容详解:
25 Port 80
监听的端口号,缺省都是80,一般无需修改。注意,如果你的httpd服务器已经开启,那么你必须关掉或者重新设定端口号,
当你修改了模式http端口那么访问的时候要加上端口号,如http://localhostip:port
作为哪个用户运行,即它拥有该用户的权限,一般都是nobody,需 要 /etc/passwd中有nobody用户
User nobody
查看: vi /etc/passwd 18 nobody❌65534:65534:nobody:/nonexistent:/usr/sbin/nologin
作为哪个用户组运行,即它拥有该用户组的权限,一般都是nogroup,需要在/etc/group文件中有nogroup组
Group nogroup
查看: vi /etc/group 39 nogroup❌65534:
是否使用本地时间。如果没有注释掉,则使用本地时间。注释掉则使用UTC时间
UseLocaltime

是否记录CGI运行信息,如果没有注释掉,则记录,注释掉则不记录
VerboseCGILogs

服务器名字
ServerName www.chad.com
是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的Web服务器。一般注释掉,即不需要启动
VirtualHost
非常重要,HTML文档的主目录。如果没有以/开始,则表示从服务器的根路径开始。注意,如果此处设置不正确,将不能打开网页
DocumentRoot /var/www
如果收到一个用户请求的话,在用户主目录后再增加的目录名
UserDir public_html
HTML目录索引的文件名,也是没有用户只指明访问目录时返回的文件名
DirectoryIndex index.html
当HTML目录没有索引文件时,用户只指明访问目录时,boa会调用该程序生成索引文件然后返回给用户,因为该过程比较慢最好不执行,
可以注释掉或者给每个HTML目录加上DirectoryIndex指明的文件
DirectoryMaker /usr/lib/boa/boa_indexer
如果DirectoryIndex不存在,并且DirectoryMaker被注释,那么就用Boa自带的索引生成程序来生成目录的索引文件并输出到下面目录,
该目录必须是Boa能读写
DirectoryCache /var/spool/boa/dircache
一个连接所允许的HTTP持续作用请求最大数目,注释或设为0都将关闭HTTP持续作用
KeepAliveMax 1000
HTTP持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接
KeepAliveTimeout 10
指明mime.types文件位置。如果没有以/开始,则表示从服务器的根路径开始。可以注释掉避免使用mime.types文件,此时需要用AddType在本文件里指明
MimeTypes /etc/mime.types
文件扩展名没有或未知的话,使用的缺省MIME类型
DefaultType text/plain
提供CGI程序的PATH环境变量值
CGIPath /bin:/usr/bin:/usr/local/bin

将文件扩展名和MIME类型关联起来,和mime.types文件作用一样。如果用mime.types文件,则注释掉,如果不使用mime.types文件,则必须使用
AddType application/x-httpd-cgi cgi
指明文档重定向路径
Redirect /bar http://elsewhere/feh/bar
为路径加上别名
Alias /doc /usr/doc
非常重要,指明CGI脚本的虚拟路径对应的实际路径。一般所有的CGI脚本都要放在实际路径里,用户访问执行时输入站点+虚拟路径+CGI脚本名
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
用户可以根据自己需要,对boa.conf进行修改,但必须要保证其他的辅助文件和设置必须和boaconf里的配置相符,不然Boa就不能正常工作。
最后将修改好的boa.conf放在开发板上的/etc/boa目录下。
在上面的例子中,我们还需要创建日志文件所在目录/var/log/boa,
创建HTML文档的主目录/var/www,将mime.types文件拷贝到/etc目录,
创建CGI脚本所在目录/var/www/cgi-bin/。
mime.types文件用来指明不同文件扩展名对应的MIME类型,一般可以直接从Linux主机上拷贝一个,
大部分也都是在主机的/etc目录下,同样,将主机的mime.types文件拷贝到开发板上的/etc目录下。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatisPlus(五)配置表名前缀:table-prefix

说明 数据库中的表名&#xff0c;和项目中的实体类名&#xff0c;并不符合默认对应规则。所有表都有同样的前缀&#xff0c;而实体类名是和表名去掉前缀后的部分对应的。 解决方案 配置全局表名前缀&#xff0c;使实体类名对应的表名&#xff0c;自动加上一段前缀。 限制 …

JSON 串和 Java 对象的相互转换

JSON 串和 Java 对象的相互转换 以 json 格式的数据进行前后端交互 前端发送请求时&#xff0c;如果是复杂的数据就会以 json 提交给后端&#xff1b; 而后端如果需要响应一些复杂的数据时&#xff0c;也需要以 json 格式将数据响应回给浏览器 为达到以上目的就需要重点学习…

基于微信小程序的美术馆预约平台设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

Linux_9_网络协议和管理

目录 1网络基础1.1 网络概念1.2常见的网络物理组件1.3网络应用程序1.3.1各种网络应用1.3.2应用程序对网络的要求 1.4网络的特征1.4.1速度(带宽)1.4.2网络拓扑 1.5网络1.5.1网络准和分层1.5.2开放系统互联OSI1.5.3网络的通信过程1.5.3.1数据封装和数据解封1.5.3.2协议数据单元PD…

基于SSM的四六级报名与成绩查询系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

机器学习 day36(纯度)

熵 这些例子的纯度和熵如图所示&#xff0c;且左侧为熵函数图熵函数是判断某组数据是否纯度高的指标 熵函数公式如上图&#xff0c;底数为2仅为了使函数峰值为1&#xff0c;且设定0log(0)为0&#xff0c;但log(0)为无穷大

【Java 基础篇】Java实现文件搜索详解

文件搜索是计算机应用中的一个常见任务&#xff0c;它允许用户查找特定文件或目录&#xff0c;以便更轻松地管理文件系统中的内容。在Java中&#xff0c;您可以使用各种方法来实现文件搜索。本文将详细介绍如何使用Java编写文件搜索功能&#xff0c;以及一些相关的内容。 文件…

【数据结构】图的应用:最小生成树;最短路径;有向无环图描述表达式;拓扑排序;逆拓扑排序;关键路径

目录 1、最小生成树 1.1 概念 1.2 普利姆算法&#xff08;Prim&#xff09; 1.3 克鲁斯卡尔算法&#xff08;Kruskal&#xff09; 2、最短路径 2.1 迪杰斯特拉算法&#xff08;Dijkstra&#xff09; 2.2 弗洛伊德算法&#xff08;Floyd&#xff09; 2.3 BFS算法&…

windows主机和vmware ubuntu18.04虚拟机ping通

windows主机 网线连接电脑&#xff0c;读取当前windows的相关信息 powershell 更改IP地址指令 New-NetIPAddress -InterfaceIndex 23 -IPAddress 192.168.0.105 -PrefixLength 24 -DefaultGateway 192.168.0.1 虚拟机 虚拟机需要管理员权限打开 选择桥接方式 IPV4地址改成同…

求生之路2专用服务器搭建对抗模式,药抗模式,特殊模式Ubuntu系统另附上游戏代码以及控制台代码

求生之路2专用服务器搭建对抗模式,药抗模式,特殊模式Ubuntu系统另附上游戏代码以及控制台代码 大家好我是艾西&#xff0c;熟悉Left 4 Dead 2求生之路2这游戏的小伙伴都知道这个游戏分为以下几种模式&#xff1a; 对抗模式&#xff1a;在对抗模式下&#xff0c;玩家需要掌握一…

小白的入门二叉树(C语言实现)

前言&#xff1a; 二叉树属于数据结构的一个重要组成部分&#xff0c;很多小白可能被其复杂的外表所吓退&#xff0c;但我要告诉你的是“世上无难事&#xff0c;只怕有心人”&#xff0c;我将认真的对待这篇博客&#xff0c;我相信只要大家敢于思考&#xff0c;肯定会有所收获…

Stm32_标准库_1

代码&#xff1a; #include "stm32f10x.h" // Device headerGPIO_InitTypeDef GPIO_InitStructure;//定义变量结构体int main(void){/*使用RCC开启GPIO的时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启PA端口时钟/*使用GPIO_…

折线图geom_line()参数选项

往期折线图教程 图形复现| 使用R语言绘制折线图折线图指定位置标记折线图形状更改 | 绘制动态折线图跟着NC学作图 | 使用python绘制折线图 前言 我们折线的专栏推出一段时间&#xff0c;但是由于个人的原因&#xff0c;一直未进行更新。那么今天&#xff0c;我们也参考《R语…

(循环)mysql定时器删除某表中数据例子

CREATE EVENT clear_interactive_logs ON SCHEDULE EVERY 1 DAY STARTS 2023-09-21 23:36:36 DO DELETE from t_interactive_log WHERE id not IN (SELECT * from (SELECT id from t_interactive_log ORDER BY occer_time DESC limit 20000) x ); END ———————————…

Spring Boot魔法:简化Java应用的开发与部署

文章目录 什么是Spring Boot&#xff1f;1. 自动配置&#xff08;Auto-Configuration&#xff09;2. 独立运行&#xff08;Standalone&#xff09;3. 生产就绪&#xff08;Production Ready&#xff09;4. 大量的起步依赖&#xff08;Starter Dependencies&#xff09; Spring …

QT实现qq登录

1、登录界面 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QMessageBox> #include <QDebug> #include "second.h" //第二个界面头文件 #include "third.h" //注册界面头文件#include <QSq…

如何进行性能测试

文章目录 前言什么是性能测试为什么要做性能测试怎么做我们的性能测试SoloPiSoloPi的介绍和安装SoloPi的性能数据 前言 随着科学技术的迅速发展&#xff0c;信息时代离不开软件&#xff0c;软件的成功上线离不开软件测试的功劳&#xff0c;因此软件测试对于软件的重要性不言而…

最新Java JDK 21:全面解析与新特性探讨

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

STP生成树协议基本配置示例---STP逻辑树产生和修改

STP是用来避免数据链路层出现逻辑环路的协议&#xff0c;运行STP协议的设备通过交互信息发现环路&#xff0c;并通过阻塞特定端口&#xff0c;最终将网络结构修剪成无环路的树形结构。在网络出现故障的时候&#xff0c;STP能快速发现链路故障&#xff0c;并尽快找出另外一条路径…

放大电路的理解

如有错误&#xff0c;敬请指正 【电子】模拟电子技术基础 上交大 郑益慧主讲&#xff08;模拟电路/模电 讲课水平堪比华成英&#xff0c;视频质量完爆清华版&#xff09;_哔哩哔哩_bilibili