guacamole学习小结(一)

article/2025/9/24 14:57:31

一、快速安装

https://blog.csdn.net/qq_38781075/article/details/106459458

二、整体理解

先放一张经典的图。

guacamole最重要的作用还是连接远程服务器的,可以连接多台服务器,连接不同的远程协议的服务器。使得用户能远程快捷的访问远程桌面。它跨越操作系统(web浏览器),然后用户不需要安装什么东西(不同的远程协议的服务器可能要安装一些东西,比如VNC客户端)。

上面这张图是从上往下看的,浏览器(用户)通过guacamole服务器(也就是中间黄色的虚线框里的Guacamole Server)连接到远程桌面(Remote Desktop),并且guacamole支持不同的协议访问远程桌面,如图中的RDP、VNC等等。

而Guacamole Server又分为两个部分,如图,一个是guacd,另外一个中间的Guacamole。中间的Guacamole实际上是部署在Tomcat上的一个web应用,所以Guacamole外面还包了一层蓝灰色的Tomcat,为了避免误解,中间的Guacamole以下简称为web应用。

Guacamole Server的这两个部分,guacd和web应用,可以放在不同的电脑上或者服务器上,它们之间的通信是通过Guacamole协议实现通信。它们又分别拥有不同的功能。

guacd启动的时候会以守护进程的形式存在于机器上。guacd主要负责跟远程桌面的服务器通信,支持不同的远程协议进行通信如RDP、VNC、SSH等,guacd每次跟一台新的机器远程通信的时候,都会建立一个新的进程专门负责跟这新的机器通信。guacd与远程桌面通信的信息,会以Guacamole协议传输的方式先交给web应用,web应用再转换为HTML的形式给用户,用户就能实时操作远程桌面。

web应用是部署在Tomcat上的,主要作用是验证用户的合法性(账号密码等),远程桌面的一些信息(如IP地址、账号密码等)也存在这里。web应用还有一个作用就是跟guacd连接,web应用并不关心远程连接的协议是什么,只需要把guacd传来的信息(Guacamole协议传输的)解析转换成HTML给用户看即可。

三、Guacamole协议

guacamole协议协议大概是这样的,下面是两条示例命令。

6.select,3.vnc;
4.args,13.VERSION_1_1_0,8.hostname,4.port,8.password,13.swap-red-blue,9.read-only;

格式:长度 + 点 +字符串数据

第一个字符串数据是命令,后面的数据都是参数,中间逗号分隔,以分号结尾。

guacamole协议有自己的解析器,能把guacamole协议解析成命令+参数的形式。第一条命令就可以解析成为:select,vnc。

guacamole协议最大的作用就是用来传输图像和命令(用户输入)的,前面说了guacd屏蔽了底层(远程桌面)协议的差异,把远程桌面实时的图像先用guacamole协议传输给web应用,最后web应用以HTML的形式展现给用户。

打个比方,就像一个显示器似的,显示器也不关心跟自己连接的操作系统是什么样的,只要你把图像通过HDMI口或者串口发送给我就行了,我就能正常显示图像。guacamole协议很像显示器的数据线。不过guacamole协议除了能传输图像,还能传输命令,又充当了鼠标键盘的作用。

四、官方测试用例

源文件

https://github.com/apache/guacamole-server/tree/master/src/libguac/tests

这些测试用例主要依赖于官方的一个库——libguac。

append.c

该文件位于parser目录下,主要是关于使用一个解析器的,解析guacamole协议的。

前面说过guacamole协议的格式。

4.test,8.testdata,5.zxcvb,13.guacamoletest;

这个文件主要调用了两个函数

guac_parser* guac_parser_alloc();
int guac_parser_append(guac_parser* parser, void* buffer, int length);

第一个函数主要作用就是申请一个解析器(并且初始化)。

第二个函数,参数有三个,第一个参数是解析器,第二个参数是缓冲区,解析器要解析的缓冲区,第三个参数就是解析器的长度。返回值就是解析的长度。最终解析的数据会存放于解析器里。

解析器是一个结构体,其中里面的state成员变量储存解析器的状态(错误、解析完全等等),opcode成员变量储存解析到的命令,argv成员变量储存解析到的参数,是个变长参数,跟main里面的argv类似。

read.c

该文件位于parser目录下,关于读取guacamole协议。

这个文件主要调用了两个函数

guac_socket* guac_socket_open(int fd);
int guac_parser_read(guac_parser* parser, guac_socket* socket, int usec_timeout);

第一个函数是用来初始化guac_socket,就是官方定义的套接字结构体,参数就传递一个普通的文件描述符(套接字)就行。这个guac_socket除了存储文件描述符,还有初始化一些回调函数,比如读取到数据调用什么函数,发送数据调用什么函数。结构里面还有一些锁,这个函数也会帮忙初始化。

第二个函数有三个参数,分别是解析器,guac_socket,还有超时时间,这个函数融合了解析器和套接字读取数据,就是从套接字读取数据并且解析出来,就是这个函数的作用。返回值-1代表解析失败,0代表成功。

next_free.c

该文件位于pool目录下,教你如何使用整型池。

这个文件主要调用了三个函数

guac_pool* guac_pool_alloc(int size);
int guac_pool_next_int(guac_pool* pool);
void guac_pool_free(guac_pool* pool);

很简单,第一个函数是申请整型池,并且参数就是整型池的大小,第二个函数就是从池里取出一个整数,第三个函数就是把一个整数放回池里。

不管是释放还是取出,都是线程安全的。释放过的整数就能从池子里再取出来。

fd_send_instruction.c

该文件位于socket目录下,讲述发送guacamole协议的报文。

这个文件主要调用了三个函数

int guac_protocol_send_name(guac_socket* socket, const char* name);
int guac_protocol_send_sync(guac_socket* socket, guac_timestamp timestamp);
ssize_t guac_socket_flush(guac_socket* socket);

前面两个函数其实可以合并一块讲,发送guacamole协议的报文,其中guacamole协议有命令和参数的部分,这些函数就帮你构造报文,这两个函数前缀都是一样的——guac_protocol_send_XXX,第一函数帮你构造一个name命令的报文,你只需要把参数填上去即可,如(假设我参数填了   aXXXX   ):

"4.name,5.aXXXX;"

第二个函数也类似,官方提供了很多这样的函数——guac_protocol_send_XXX,便于发送guacamole协议的报文,返回值为0代表成功,非0代表失败。这个函数不仅构造报文还顺便把报文发送了,这是第一个套接字参数的作用。

最后一个函数就是刷新缓冲区,把剩余所有未发送的报文都发送了。返回值,成功为正数,超时为0,错误为负数。

strlcat.c strlcpy.c strljoin.c

这三个文件一块讲了,每个文件对应于它文件名的一个函数。

size_t guac_strlcat(char* restrict dest, const char* restrict src, size_t n);
size_t guac_strlcpy(char* restrict dest, const char* restrict src, size_t n);
size_t guac_strljoin(char* restrict dest, const char* restrict const* elements,int nmemb, const char* restrict delim, size_t n);

第一个函数,拼接两个字符串,用法跟标准的拼接函数差不多,关键是第三参数,第三个参数说明第一个参数的长度,也就是目的串的大小(这个大小包含'\0'),如果长度太小就拼接一部分,比如

char buffer[1024];
strcpy(buffer, "Apache ");
guac_strlcat(buffer, "Guacamole", 9);
//结果拼接的结果是
//"Apache G"
//返回值为16

返回值是源字符串和目地字符串的长度相加(无论空间是否足够,不统计'\0')。判断串的长度是以'\0'为标记判断,不是字符串长度。

第二个函数,拷贝字符串,用法跟标准的拷贝函数差不多,第三个参数说明第一个参数的长度,跟上面一样,返回值是源字符串的长度,不统计\0'。

char buffer[1024];
memset(buffer, 0xFF, sizeof(buffer));
guac_strlcpy(buffer, "Guacamole", sizeof(buffer));
//buffer为"Guacamole"
//返回值为9

第三个函数是拼接多个字符串,前面两个参数就是目的串和拼接字符串数组,第三个参数是拼接几个字符串,第四个参数是拼接两个字符串中间加的东西,下面我加了一个空格,第五个参数就是第一个参数的长度,跟前面一样,返回值是拼接后的长度,不统计\0'。

const char* const apache_guacamole[] = { "Apache", "Guacamole" };
char buffer[1024];memset(buffer, 0xFF, sizeof(buffer));
guac_strljoin(buffer, apache_guacamole, 2, " ", sizeof(buffer));
//拼接后buffer为"Apache Guacamole"
//返回值为16

 


http://chatgpt.dhexx.cn/article/pedjZBp0.shtml

相关文章

guacamole 认识

简介:guacamole是apache开源的一款连接远程机器(类似window机器的mstsc工具以及linux的 xfreerdp远程工具)的web应用。 官网:http://guacamole.apache.org/ 一、介绍 1、先看看官网提供的架构图 其中guacamole将架构图中 HTML5(JavaScript编写)以及g…

Guacamole搭建教程

目录 安装系统环境安装依赖环境安装依赖包 下载安装包服务端安装解压并安装:在当前目录下继续执行:安装完成之后,可以使用以下来看guacd是否安装成功: 客户端安装安装安装git安装maven 下载客户端并解压创建/etc/guacamole/文件目…

使用EasyDarwin+FFmpeg实现rtsp推流

一、背景 ​ 最近在学习ffmpeg的基本操作,ffmpeg功能非常强大,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库 可以利用ff…

windows 10 安装EasyDarwin流服务器推流、本地存储

1、EasyDarwin介绍 EasyDarwin 是一款开源的、高性能的rstp流媒体服务器,基于go语言开发。主要功能有:支持rtsp推流分发、支持rtsp拉流分发、录像、检索、回访、关键帧缓存、秒开画面、Restful接口、web后台管理、分布式负载均衡等特点。 2、安装部署&a…

从零开始搭建EasyDarwin环境——Windows系统开发环境Golang的搭建

EasyDarwin在语言上服务端使用的是Golang,前端网页是Vue,因此我们需要有Golang和node的开发环境。上一篇我们介绍了Linux环境下的搭建,本章我们将说明一下如何在Windows下搭建起Golang环境。 一、下载 Go包 Go的官方网站:http://…

EasyDarwin源码分析(三)——rtsp-client

rtsp-client.go 这个模块主要实现了客户端的拉流功能。也就是在网页上点击“拉流分发”按钮后,easydarwin会向用户填写的源地址拉流,然后再转发出去,在向源地址拉流的时候,easydarwin相当于是一个rtsp客户端。所以这里使用rtsp-c…

EasyDarwin源码分析(一)——main.go

main.go ​ easydarwin源码的代码量不是很多,主要的代码也就集中在下面的几个文件夹中,核心业务的代码也就主要集中在rtsp包中。 ​ 而且用Go语言写的代码,不像springboot那样,你在读源码前至少要对Springboot框架有一定的学习&a…

关于EasyDarwin二次开发编译后无法以服务启动的问题

问题描述: 在win7上二次开发EasyDarwin后,编译出的EasyDarwin.exe运行正常,或是使用ServiceInstall-EasyDarwin.exe在系统中注册服务,启动服务也正常。 于是打包将其部署在win server 2008上,发现如果直接运行EasyDar…

EasyDarwin接口的使用——使用C++编写客户端实现与EasyDarwin服务器的交互

EasyDarwin提供了接口供客户端使用,以实现客户端与其的交互。比如,根据EasyDarwin的8.1.0版本的接口文档,有获取推流列表的接口如下所示: 我们可以测试一下上述接口。首先启动EasyDarwin服务器,启动后在浏览器&#xf…

EasyDarwin的交叉编译

easyDarwin的交叉编译 前言一、EasyDarwin简介二、配置环境介绍三、交叉编译过程1.go环境的搭建2.编译 后记 前言 最近项目有个需求是在嵌入式设备中运行一个RTSP服务器,满足推流到该服务器后,其他终端设备能够从这个RTSP服务器中拉RTSP流出来。找来找去…

EasyDarwin 流服务器搭建及相关软件教程

一、产品 运行 exe 文件 启动 服务器 双击 运行 EasyDarwin.exe 会出现如下界面: 在 浏览器打开 http://192.168.10.80:10008 2.解压ffmpeg 添加环境变量:复制C:\SoftWare\ffmpeg-6.0-essentials_build\bin路径,添加环境变量中 的用户变…

EasyDarwin —— ubuntu搭建rtsp服务,使用FFmpeg进行rtsp推拉流

开源流媒体服务器 EasyDarwin是由国内开源流媒体团队开发和维护的一款开源流媒体平台框架,从2012年12月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构的开源项目,更好地帮助广大流媒体开发者和创业型企…

EasyDarwin测试

EasyDarwin是由国内开源流媒体团队维护的一款开源流媒体平台框架,开发语言是go语言。本文主要使用它作为RTSP服务器使用,并以此进行测试。方便之后记录。 (1)软件获取(自行下载,具体代码编译方式&#xff0…

流媒体开发之EasyDarwin搭建rtsp server

0 背景 EasyDarwin 旭帆科技开源的流媒体服务器软件,EasyDarwin 社区专注于传统安防(RTSP/RTP/Onvif)流媒体技术,能够帮助开发者快速搭建流媒体服务平台,更快、更简单地实现流媒体直播与点播功能。本文主要介绍 rtsp …

EasyDarwin ffmpeg+EasyDarwin开源流媒体服务器平台试用笔记(视频流rtsp)

服务 Github https://github.com/EasyDarwin/EasyDarwin , server will invoking ffmpeg. 1. download server 下载EasyDarwin-windows-8.1.0-1901141151 双击EasyDarwin.exe 访问http://127.0.0.1:10008/#/ 2. download FFmpeg 下载FFmpeg : https://github.com/BtbN…

从零开始搭建EasyDarwin环境——linux系统共享目录实现

EasyDarwin是一款高性能开源RTSP流媒体服务器,基于Go语言研发,维护和优化:RTSP推模式转发、RTSP拉模式转发、录像、检索、回放、关键帧缓存、秒开画面、RESTful接口、Web后台管理、分布式负载均衡。EasyDarwin从最初的c到后面的nodejs再到现在…

使用EasyDarwin搭建Rtsp Server从大华摄像头拉流进行多路分发

使用EasyDarwin搭建Rtsp Server从大华摄像头拉流进行多路分发 问题服务搭建推流命令大华摄像头配置 问题 大华摄像头(型号: DH-IPC-HDW1235C-A 2.8MM 200万高清网络摄像机 )目前支持20路连接,实际使用测试过程中,只能…

EasyDarwin —— windows搭建rtsp服务,使用FFmpeg进行rtsp推拉流

开源流媒体服务器 EasyDarwin是由国内开源流媒体团队开发和维护的一款开源流媒体平台框架,从2012年12月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构的开源项目,更好地帮助广大流媒体开发者和创业型企业快速构建流媒体服务平台,更快、更简单地…

简单的流媒体服务器(EasyDarwin的安装搭建)

再项目中需要用到简单的视频播放,想着干脆搭建一个流媒体服务器,后期做视频点播 直播包括视频服务器的负载,所以索性开始自己探索搭建视频流媒体服务器,用于存储和传输视频资源 相关概念 流媒体 流媒体(Streaming Me…

【ZYNQ】ZYNQ7000 私有定时器及其驱动应用示例

定时器简介 在 ZYNQ 嵌入式系统中,定时器的资源是非常丰富的,每个 Cortex-A9 处理器都有各自独立的 32 位私有定时器和 32 位看门狗定时器,这两个 CPU 同时共享一个 64 位的全局定时器(GT)。 系统框图 私有定时器 特…