【实战】物联网安防监控项目【2】———boa服务器的移植

2023-05-16

一、boa服务器的移植

1、源码下载

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

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 自动搜索依赖,下面选择 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

6、返回boa的顶层目录  --- 修改配置文件

回到 boa-0.94.13 目录,

vi boa.conf //几乎全部指定到boa的目录下,这样方便我们进行管理

重新指定一些文件的生成路径,因为重新指定这些路径后会帮助我们深刻的理解关于boa服务器的工作机制,对照以下代码进行修改:

	Port  80  
	User  0  
	Group 0  

	ErrorLog /boa/log/error_log  
	AccessLog /boa/log/access_log   

	DocumentRoot /boa/www  
	UserDir public_html  

    DirectoryMaker /boa/boa_indexer   //修改

    MimeTypes /boa/mime.types   //修改
    
    Alias /doc /usr/doc
    ScriptAlias /cgi-bin/ /boa/cgi-bin/ 

    

7.建立测试页面

(1)index.html  ,将index.html 放在/boa/www目录下

sudo cp index.html image.jpg /boa/www
 <html> 

     <body> 

         <h3>this is a test!</h3><br/> 

         <img src="image.jpg"/> 

         <h3>tree picture</h3><br/> 

         <a href="/cgi-bin/test.cgi">to cgi page</a>    //指定了cgi可执行文件存放的路径,默认从/boa的根目录开始查找

     </body> 

  </html>  

注意: 笔记本打开,另存为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; 

  } 

8、查看/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_erroraccess_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浏览器,输入ubuntuip地址,就可以看到你放在/var/www里的网页了。ok

    

测试结果:

  http://127.0.0.1/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 pidboa

  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目标文件时会失败。

而先rmcp的话,新文件的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目录下生成的boaboa_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:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin

作为哪个用户组运行,即它拥有该用户组的权限,一般都是nogroup,需要在/etc/group文件中有nogroup

Group nogroup

查看:  vi /etc/group   39 nogroup:x: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目录下。

         

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

【实战】物联网安防监控项目【2】———boa服务器的移植 的相关文章

  • bluerov

    ov这个东西其实不难 xff0c 比较麻烦的是密封 xff0c 防水等工作 xff0c 而非一些技术性工作 xff08 所谓技术性工作就是算法 xff0c 人工智能等 xff09 现在供玩家玩的Rov xff0c 基本模式是这样的 xff0
  • 在线教程 | 用「网红项目」DeepSOCIAL 进行社交距离监测

    首发自 xff1a 公众号 HyperAI超神经 内容一览 xff1a YOLO v4 是一个实时的 高精度的目标检测模型 xff0c 本教程将详细讲解如何基于 YOLO v4 和 SORT 算法 xff0c 实现在多目标条件下的人群距离检
  • C#实现服务端/客户端的tcp异步通信完整示例

    demo 通过一个简单的demo xff0c 实现服务器和客户端之间的tcp异步通信 消息进行了Des加密和解密 运行动图如下 xff1a 图中有三个程序在运行 xff0c 最左边是服务端 xff0c 另外两个是客户端 xff0c 客户端可
  • C++封装HTTP

    C 43 43 封装HTTP Client 简介HTTP请求头封装HTTP请求头基本格式post请求头封装post请求头 HTTP Client 以及HTTP Server交互HTTP消息解析TCP封装HTTP Client的坑 Trans
  • android 自定义多功能进度条

    自定义进度条 xff0c 直接在布局文件里传入颜色值 xff0c 不用自己再去写样式 xff0c 还可以 效果图 xff1a git地址
  • 树莓派L298N电机驱动程序连接图文教程

    手里有一块树莓派3闲置很久 xff0c 不知干点啥好呢 看到不少网友用树莓派做智能小车 xff0c 好像很好玩的酱紫 xff0c 就到淘宝买了一些配件 对于硬件小白的我来说安装过程并不轻松 xff0c 网上看了很多资料但有的地方介绍的并不很
  • 一个比较好用的socket 类封装(封装http 请求)

    name myhttp h function http 请求 copyright author mark date 2008 05 13 ifndef MY HTTP INCLUDE define MY HTTP INCLUDE inclu
  • Odroid U3 烧写镜像文件

    在Ubuntu下往Odroid U3板子的eMMC卡里烧写xubuntu镜像文件 xff0c 主要步骤如下 xff1a 1 下载要烧写的镜像文件 xff0c 按照需要 xff0c 我下载的是桌面版的xubuntu 13 04 desktop
  • 解决odroid-XU3的HDMI输出问题

    odroid XU3的板子直接通过microHDMI口连接显示器 xff0c 并没有显示 解决方法是修改 media boot boot ini文件 xff0c 取消屏蔽与HDMI设置相关语句 重启之后 xff0c 解决问题 由于不同的显示
  • 现有的 TypeRef 应有对应的 TypeDef(Impl),但它没有

    现有的 TypeRef 应有对应的 TypeDef Impl xff0c 但它没有 本人需要在C 中调用C 43 43 代码 xff0c 故而建立了一个CLR项目 xff0c 建立了四个文件 xff0c 分别是两个纯C 43 43 文件 C
  • [zed2i] 相机内参数获取

    内置对应的程序 xff1a 双目SDK校正方法 关灯避免反射 xff0c 使得房间的灯光尽可能的黑 xff0c 拿着相机对准屏幕的标定板 xff08 可以不关灯 xff09 开始校正 xff0c 红圈是目标 xff0c 需要移动蓝圈 xff
  • Unity 2D独立开发手记(八):基于A*算法的简易寻路

    被生活 43 43 了一个多月 xff0c 都没时间上来吹比了 因为破游戏准备设计敌人了 xff0c 苦于Unity自带的导航系统迟迟不适配2D项目 xff0c 即便用最新的NavMeshSurface把3D当成2D来用 xff0c 也和我
  • 新建keil工程每一个文件夹的作用

    问 xff1a 头文件stm32f10x sdio c的作用 xff1f 有时候在添加路径的时候为什么不添加src xff1f 有些工程里就添加了 新建工程的每一个文件夹的作用 core xff0c obj xff0c STM32 FWLI
  • VScode使用时常见问题

    写在篇首 xff0c vscode各种蜜汁bug xff0c 记录一下解决方案供大家参考 1 无法使用C 43 43 万能头文件 include xff1c bits stdc 43 43 h xff1e 解决方案 在刷题的时候 xff0c
  • Socket网络编程总结

    网络中进程之间如何通信 Java最初是作为网络编程语言出现的 xff0c 其对网络提供了高度的支持 xff0c 使得客户端和服务器的沟通变成了现实 xff0c 而在网络编程中 xff0c 使用最多的就是Socket 像大家熟悉的QQ MSN
  • linux tcp并发式服务器应用SELECT函数编写实例源代码(转载)

    include lt stdio h gt include lt stdlib h gt include lt unistd h gt include lt errno h gt include lt string h gt include
  • Activity启动模式与任务栈(Task)、TaskAffinity应用场景【转】

    转载请注明出处 xff08 谢谢 xff09 xff1a Activity启动模式与任务栈 Task 全面深入记录 xff08 下 xff09 activities waiting to finish 任务栈 zejian 的博客 CSDN
  • VsCode技巧快捷键

    按住Alt 43 鼠标点击可以有多处光标同时编辑 快速显示大纲 相当于eclipse的打开当前类方法列表弹框 gt 设置为Alt 43 D 搜索go to symbol in File 设置即可 vscode设置匹配花括号跳转 Ctrl 4
  • jmeter察看结果树的响应数据时显示乱码

    找到jmeter的安装路径 xff08 即解压路径 xff09 打开apache jmeter 4 0 bin jmeter properties文件 搜索 encoding 关键字 xff0c 找到如下配置 xff1a The encod
  • class 和 struct的区别

    class 和 struct 最本质的区别 class 是引用类型 xff0c 它在堆中分配空间 xff0c 栈中保存的只是引用 xff1b 而 struct 是值类型 xff0c 它在栈中分配空间 什么是class class xff08

随机推荐

  • 第一周——总体了解STM32以及开发环境搭建

    什么是STM32 意法半导体 xff08 ST xff09 集团于1988年6月成立 xff0c 是由意大利的SGS微电子公司和法国Thomson半导体公司合并而成 STM32系列基于专为要求高性能 低成本 低功耗的嵌入式应用专门设计的AR
  • 【ros下激光雷达的简单使用】(1)

    雷达简单使用方法 xff1a 思蓝科技S2的激光雷达 查看硬件是否连接成功 xff1a 使用lsusb wpf 64 wpfpc lsusb Bus 002 Device 001 ID 1d6b 0003 Linux Foundation
  • AMD CPU 电脑突然画面声音突然卡顿,卡碟声,画面撕裂

    有时候会突然卡顿个一两秒 xff0c 然后自己好 xff0c 如果主板买的早 xff0c 没更新过BIOS版本 xff0c 可能是因为AMD的fTPM设置有个BUG xff0c 开启之后有概率会随机卡顿 xff0c 各大厂商最新的主板驱动应
  • STL —— vector,list,deque,使用与优缺点比较

    关于vector list deque 已经做过介绍 xff0c 本文是对三种容器的优劣做出比较 下面是vector list deque的博客链接 vector list deque vector list对比 底层结构 动态顺序表 xf
  • android手机版tcp或者udp通讯测试工具,可以用于工业设备或者系统开发时间测试tcp或是udp连接通讯是否正常工作

    TUtool 介绍 由于工作需要一款安卓的tcp udp测试工具 xff0c 而市场里没有或者不好用 xff0c 或者都是广告 xff0c 现在个人开发者又不让发布应用了 xff0c 小巧好用不收集用户信息的不收费没有广告的小工具只能自己用
  • microhard p900数传配置方法

    配置好的两个 xff08 多个 xff09 数传电台可以通过串口直接相互通讯 xff0c 两个 xff08 多个 xff09 数传之间无线连接 数传电台可以配置多种通讯方式 xff1a 点对点 点对多 mesh组网 xff08 电台数量 2
  • boost.asio异步调用使用智能指针

    boost asio中的异步async 函数需要传入回调函数参数 xff0c 如果回调函数使用lamda表达式 xff0c 在 capture 列表中传入智能指针 xff0c 智能指针会生效吗 xff1f 在async connect调用之
  • sscanf 格式化输入 的关键 VS2010\VC\crt\src\input.c

    VS2010 VC crt src ctype h define ischartype l Char Flag Locale Locale 61 NULL amp amp locale t Locale gt locinfo gt mb c
  • VS万能头文件添加方法(整理版)

    本文所使用的技术来自B站up主 昕辰丶 首先按照图中箭头找到VS在磁盘中的位置 按照箭头操作 先在搜索中输入msvc 然后点击Tools结尾的MSVC文件夹 点击这唯一的文件夹 打开include文件夹 新建一个文件夹并且命名为 bits
  • 集美大学-浙大版《C语言程序设计实验与习题指导(第3版)》

    这是我2020年大一入学前写的代码 xff0c 当时的测试点是全过的 xff0c 现在可能有些测试点过不去了 xff0c 如果有发现测试点过不去的 xff0c 可以联系我修改一下 xff0c 希望大家共同进步 xff08 工作量有点大 xf
  • 集美大学 - 2840 - 实验7-1 - 编程题

    实验7 1 1 一维数组 简化的插入排序 本题要求编写程序 xff0c 将一个给定的整数插到原本有序的整数序列中 xff0c 使结果序列仍然有序 输入格式 xff1a 输入在第一行先给出非负整数N xff08 lt 10 xff09 xff
  • 听劝,不要试图以编程为基础去学习网络安全

    目录 一 网络安全学习的误区1 不要试图以编程为基础去学习网络安全2 不要刚开始就深度学习网络安全3 收集适当的学习资料4 适当的报班学习 二 学习网络安全的些许准备1 硬件选择2 软件选择3 外语能力 三 网络安全学习路线第一阶段 xff
  • 集美大学 - 2840 - 实验8 - 编程题

    实验8 1 9 指针 输出学生成绩 本题要求编写程序 xff0c 根据输入学生的成绩 xff0c 统计并输出学生的平均成绩 最高成绩和最低成绩 建议使用动态内存分配来实现 输入格式 xff1a 输入第一行首先给出一个正整数N xff0c 表
  • vscode中文乱码问题及几种常见的解决方案

    问题及原因 问题原因 xff1a 代码文件的字符编码格式为UTF 8 xff0c 但是terminal的字符编码格式为GBK 解决思路 xff1a 统一代码文件和terminal的字符编码格式 解决办法 说明 xff1a 以下的解决方案是针
  • 集美大学 - 2840 - 实验11-2 - 函数题

    实验11 2 1 链表 建立学生信息链表 本题要求实现一个将输入的学生成绩组织成单向链表的简单函数 函数接口定义 xff1a span class token keyword void span span class token funct
  • python正则表达式

    python正则表达式 match函数 re match尝试从字符串的起始位置匹配一个模式 xff0c 如果不是起始位置匹配成功的话 xff0c match 就返回none 函数语法 xff1a re span class token pu
  • 轻松解决VS配置OpenCV环境及导出OpenCV的VS项目模板

    一 OpenCV配置 1 下载OpenCV 点击进入下载OpenCV的官网界面 这里以Windows为例 xff0c 其他同理 xff08 可直接下载最新 xff09 2 提取OpenCV 在这里浅说一句 xff0c 为了方便环境配置文件管
  • 最大子段和问题

    以下给出具体代码 xff1a span class token macro property span class token directive hash span span class token directive keyword i
  • 如何简单又好看地美化你的Ubuntu界面

    起因 最近使用Ubuntu界面实属是审美疲劳了 xff0c 使用老版本的一大问题就是 界面太难看了 秉持新手学习最好是用老一点的稳定版本的观念 Ubuntu旧版本使用或使用过的人非常非常多 xff0c 学习的过程中你一旦出现什么问题互联网上
  • 【实战】物联网安防监控项目【2】———boa服务器的移植

    一 boa服务器的移植 1 源码下载 1 1 boa简介 xff1a 其可执行代码只有大约60KB左右 xff0c Boa是一个单任务的HTTP服务器 xff0c Boa只能依次完成用户的请求 xff0c 而不会fork出新的进程来处理并发