spice-gtk介绍:

spice-gtk是基于红帽的spice远程连接协议的一套客户端核心源码,上层有一套virt-viewer也是客户端源代码,只不过spice-gtk属于底层直接对话协议的项目,而virt-viewer是基于spice-gtk的更加偏向于界面的项目。

spicy:

spicy是基于spice-gtk项目的一个测试可执行文件(virt-viewer的可执行文件remote-viewer是更加前端的连接客户端),此命令可以直接连接远程桌面,首先给一下spicy的使用方法:

spicy -h 192.168.112.32 -p 61000 -w 123

其中ip端口和密码都是服务端创建虚拟机时已经设置好的(在此不说服务端),spicy源代码在spice-gtk/tools/spicy.c下面,我们可以从这里作为头,开始慢慢渗透spice-gtk项目。下面是spicy的主函数入口:

int main(int argc, char *argv[])
{GError *error = NULL;GOptionContext *context;spice_connection *conn;gchar *conf_file, *conf;char *host = NULL, *port = NULL, *tls_port = NULL, *unix_path = NULL;keyfile = g_key_file_new();//keyfile是一个全局变量,我们将配置文件读到keyfile里面,再在程序里面读取保存的配置文件int mode = S_IRWXU;conf_file = g_build_filename(g_get_user_config_dir(), "spicy", NULL);//g_get_user_config_dir()这个在linux下是/root/.configif (g_mkdir_with_parents(conf_file, mode) == -1)SPICE_DEBUG("failed to create config directory");g_free(conf_file);conf_file = g_build_filename(g_get_user_config_dir(), "spicy", "settings", NULL);if (!g_key_file_load_from_file(keyfile, conf_file,G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, &error)) {SPICE_DEBUG("Couldn't load configuration: %s", error->message);g_clear_error(&error);}/* parse opts */gtk_init(&argc, &argv);
#if HAVE_GSTAUDIO || HAVE_GSTVIDEOgst_init(&argc, &argv);
#endifcontext = g_option_context_new("- spice client test application");g_option_context_set_summary(context, "Gtk+ test client to connect to Spice servers.");g_option_context_set_description(context, "Report bugs to " PACKAGE_BUGREPORT ".");g_option_context_add_group(context, spice_get_option_group());g_option_context_set_main_group(context, spice_cmdline_get_option_group());g_option_context_add_main_entries(context, cmd_entries, NULL);g_option_context_add_group(context, gtk_get_option_group(TRUE));
#if HAVE_GSTAUDIO || HAVE_GSTVIDEOg_option_context_add_group(context, gst_init_get_option_group());
#endifif (!g_option_context_parse (context, &argc, &argv, &error)) {g_print("option parsing failed: %s\n", error->message);exit(1);}g_option_context_free(context);if (version) {g_print("spicy " PACKAGE_VERSION "\n");exit(0);}/*从这里开始上面其实都不用看,上面keyfile是读配置文件的能记住上次连接的ip和端口什么的,option_context是spicy的参数列表,执行前命令行敲打spicy --help显示的东西,下面才是真正的开始*/mainloop = g_main_loop_new(NULL, false);//mainloop是个全局变量,先创建变量但是先不阻塞直到g_main_loop_run的时候程序阻塞conn = connection_new();spice_set_session_option(conn->session);spice_cmdline_session_setup(conn->session);g_object_get(conn->session,"unix-path", &unix_path,"host", &host,"port", &port,"tls-port", &tls_port,NULL);/* If user doesn't provide hostname and port, show the dialog windowinstead of connecting to server automatically */if ((host == NULL || (port == NULL && tls_port == NULL)) && unix_path == NULL) {if (!spicy_connect_dialog(conn->session)) {exit(0);}}g_free(host);g_free(port);g_free(tls_port);g_free(unix_path);connection_connect(conn);if (connections > 0)g_main_loop_run(mainloop);//程序阻塞,在connection_destroy函数执行的时候会解开,程序就会往下走g_main_loop_unref(mainloop);/*写配置文件,从keyfile到conf_file*/if ((conf = g_key_file_to_data(keyfile, NULL, &error)) == NULL ||!g_file_set_contents(conf_file, conf, -1, &error)) {SPICE_DEBUG("Couldn't save configuration: %s", error->message);g_error_free(error);error = NULL;}g_free(conf_file);g_free(conf);g_key_file_free(keyfile);g_free(spicy_title);setup_terminal(true);
#if HAVE_GSTAUDIO || HAVE_GSTVIDEOgst_deinit();
#endifreturn 0;
}

从代码中间开始上面其实都不用看,上面keyfile是读配置文件的能记住上次连接的ip和端口什么的,option_context是spicy的参数列表,执行前命令行敲打spicy --help显示的东西,下面才是真正的开始,代码注释有解释

mainloop = g_main_loop_new(NULL, false); 这里是创建一个循环对象,false表示未开始循环,一旦执行g_main_loop_run(mainloop);,程序就会进入睡眠状态,所有的界面程序都会有这样的操作,主程序睡眠,等待触发的是界面上的信号和相应的方法。

conn = connection_new();//初始化一个连接的对象,里面包括另一个对象session(所有的连接参数都在这个对象里面)
           spice_set_session_option(conn->session);//设置一些session中的额外的参数
           spice_cmdline_session_setup(conn->session);//设置session中的最主要的几个参数ip端口密码等

如果spicy命令行没设置参数,下面代码会去判断session对象中到底有没有没初始化参数,没有的话会调用一个界面,然后卡在那边让你写参数,spicy_connect_dialog实现了一个gtk的界面。

    g_object_get(conn->session,"unix-path", &unix_path,"host", &host,"port", &port,"tls-port", &tls_port,NULL);/* If user doesn't provide hostname and port, show the dialog windowinstead of connecting to server automatically */if ((host == NULL || (port == NULL && tls_port == NULL)) && unix_path == NULL) {if (!spicy_connect_dialog(conn->session)) {exit(0);}}

spicy不加参数调用spicy_connect_dialog,下面是界面。

spicy_connect_dialog界面

        点击connect会以后会设置参数之后spicy_connect_dialog正常返回,一切参数准备就绪以后,执行connection_connect(conn)连接远程桌面。g_main_loop_run(mainloop);主程序处于睡眠状态。

        connection_connect(conn);//连接远程桌面
        if (connections > 0)
                g_main_loop_run(mainloop);
//主函数睡眠,直到调用connection_destroy中的g_main_loop_quit才会往下走
        g_main_loop_unref(mainloop);

这里是spicy的大概的流程,关于connection_connect(conn);以后再分析。

spice-gtk-0.35源代码解析之spicy解析相关推荐

  1. FFmpeg的HEVC解码器源代码简单分析:解析器(Parser)部分

    ===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...

  2. windows 2003 下的 apache(2.2.23)+tomcat(7.0.35)+php(5.3.21) 集成

    买了一个VPS 由于需求,需要在上面配置可以支持discuz论坛,也可以支持j2ee的项目 配置这个环境搞了我1天多才搞出来,之间很曲折啊,于是用记录下过程,希望能帮助需要帮助的人. 网上非常多的 a ...

  3. windows 2003 下的 apache(2.2.23)+tomcat(7.0.35)+p...

    为什么80%的码农都做不了架构师?>>>    买了一个VPS 由于需求,需要在上面配置可以支持discuz论坛,也可以支持j2ee的项目 配置这个环境搞了我1天多才搞出来,之间很曲 ...

  4. asp.net2.0文件管理源代码

    一个非常经典的asp.net2.0文件管理源代码,不知道以前各位是否看到.但我还是放上来,所谓经典就是说它易懂,容易让人看透.呵呵.对于新手很有帮助.在这里帖出代码.供大家学习,有些不足的话大家自己补 ...

  5. 《LINUX3.0内核源代码分析》第一章:内存寻址

    https://blog.csdn.net/ekenlinbing/article/details/7613334 摘要:本章主要介绍了LINUX3.0内存寻址方面的内容,重点对follow_page ...

  6. 上升沿_为什么示波器上升时间 Tr=0.35/BW ?

    上一篇文章中简单描述了选择示波器带宽时"5倍法则"的由来,今天再跟大家一起探讨一下另一个经典公式:Tr=0.35/BW. 对于任意一个LTI系统,都有自己的瞬态响应过程,响应的快慢 ...

  7. 中国移动短信网关CMPP3.0 C#源代码:使用示例

    中国移动短信网关CMPP3.0 C#源代码使用,在上一篇文章中我介绍过cmpp3.0,这段时间因为也做关于 移动短信网关的开发,在这里给大家一个演示如何使用cmpp3.0开发移动短信网关. Using ...

  8. linux内核加载卡主,请教mx6,linux3.0.35,tf卡能启动uboot但是无法加载内核问题

    请教mx6,linux3.0.35,tf卡能启动uboot但是无法加载内核问题 cpu:mcimx6u5dvm10AB 硬件上,我把wp和cd都直接接地了,这次新加工的核心板,以及重新设计一个新项目的 ...

  9. 《LINUX3.0内核源代码分析》第二章:中断和异常 【转】

    转自:http://blog.chinaunix.net/uid-25845340-id-2982887.html 摘要:第二章主要讲述linux如何处理ARM cortex A9多核处理器的中断.异 ...

最新文章

  1. 概率论与数理统计--第三章
  2. mysql 切表_mysql--------命令来操作表
  3. [推荐]SharePoint开发WebCast
  4. 推荐一个不到300k的Gif处理神器 - Gifsicle(免费下载)
  5. Open Asset Import Library
  6. 几个有趣的python技巧
  7. java社区活跃度_Java并发编程-活跃度问题
  8. 事件对象以及事件委托(pink老师笔记)
  9. 聚合函数、分组、子查询及组合查询
  10. 关于Oracle用sqlldr导入限制值长度大于255问题解决方法
  11. 80c51流水灯程序汇编语言,stc89c51单片机流水灯程序.doc
  12. 微信小程序公农历转换的实现
  13. Ant Design Of react modal框动态控制footer展示或者隐藏
  14. 仅用钩子实现QQ桌球瞄准器
  15. python自动玩游戏_python学习:(2)自动玩2048游戏
  16. 自然语言处理简介及研究方向
  17. MATLAB算法实战应用案例精讲-【深度学习】扩散模型(DM)(附python代码实现)
  18. 由legacy+MBR改为UEFI+GPT引导方式
  19. 电脑系统重装时海康威视IVMS-4200客户端注意事项
  20. 视频文件打不开怎么办,怎么修复?

热门文章

  1. html5核显加速,英伟达:用GTX 16系列显卡加速,视频编辑速度达核显8倍
  2. 北美票房排行榜 实时_诸城客房管理软件排行榜
  3. Google中国博客开通啦~!!
  4. 应用程序无法正常启动0x000007b,请单击“确定”关闭应用程序(不要着急,先定位问题)
  5. STM32Cube和HAL库使用初体验-第5季第2部分-朱有鹏-专题视频课程
  6. Mysql多层子查询(收藏夹案例)
  7. DNS域名服务协议和其实现Bind应用
  8. 韩金融研究院院长:加密托管是市场增长的关键
  9. 将insert语句转化为select语句,进行校验,验证是否插入成功
  10. MT4如何添加交易品种?