vdagent与vdserver

本文详细介绍了Spice VDAgentMessage协议及其在虚拟机中的作用,包括其结构、处理过程以及如何实现虚拟机与主机间的剪贴板共享。通过具体的VDAgentClipboard消息示例,阐述了数据在Agent、Server和Client之间的传递,同时展示了添加新VDAgentMessage子类型的方法,如虚机管理消息的发送和接收流程。
摘要由CSDN通过智能技术生成

                     Spice VDAgentMessage 协议及使用

   I.概要

    Spice 包含三块:绑定在qemu/kvm上的Server(模块), 运行在(远程)主机上的Client(程序),和运行在Guest(虚拟机)上Agent(程序),(虚拟机运行在qemu­spice上)。Server将运行在qemu­spice上的虚拟机的数据通过channel(socket)传给client 显示输出,并和后者交互;agent 会辅助server/client在虚机上执行一些任务。


    Win32中,Spice Agent是服务程序,由vdservice.exe和vdagent.exe组成,前者负责与系统和VDI端口通信,后者负责具体任务。二者之间建立pipe通信。

II.VDAgentMessage结构和操作

    1.VDAgentMessage结构示例

    这三方关于agent任务的所有数据通信,都基于struct VDAgentMessage

    typedef struct SPICE_ATTR_PACKED VDAgentMessage { 

        uint32_t protocol;    //协议名长为32字节的unsigned int

        uint32_t type; //类别:剪贴板,鼠标事件...

        uint64_t opaque;     //掩码:消息发往何处

        uint32_t size; //大小=data的长度+某子类型长度

        uint8_t data[0];     //附加数据,实际是uint8_t*,所有msg本质上都存在uint8_t[]内。

    } VDAgentMessage; 

    VDAgentMessage存于长度可变的uint8_t[]内,可对.type和.data处理,生成各种子类型。

    具体为例,spice实现了agent所在的虚机和client所在的主机共享剪贴板,剪贴板消息的数据结构是

    struct VDAgentMessage clip_msg = 

new uint8_t[_out_msg_size=sizeof(VDAgentMessage)+sizeof(VDAgentClipboard)+clip_data_len] ={

    .protocol =   VD_AGENT_PROTOCOL;

    .type =    VD_AGENT_CLIPBOARD;

    .opaque=    ...方向

    .size=    sizeof(VDAgentClipboard)+clip_data_len;

    .data=    new uin8_t[.size];

};

此时clip_msg.data 即为(VDAgentClipboard*)clip_msg.data:

struct VDAgentClipboard//即把clip_msg.data[]内的数据进行细分当结构体看待:

{

    .uint32_t type, //剪贴数据类型

    .uint8_t* data = new uint8_t[clip_data_len],//这才是剪贴的数据clip_data

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值