1 主通道协议定义
1.1服务器—》客户端
enum { SPICE_MSG_MAIN_MIGRATE_BEGIN = 101, SPICE_MSG_MAIN_MIGRATE_CANCEL, SPICE_MSG_MAIN_INIT, SPICE_MSG_MAIN_CHANNELS_LIST, SPICE_MSG_MAIN_MOUSE_MODE, SPICE_MSG_MAIN_MULTI_MEDIA_TIME, SPICE_MSG_MAIN_AGENT_CONNECTED, SPICE_MSG_MAIN_AGENT_DISCONNECTED, SPICE_MSG_MAIN_AGENT_DATA, SPICE_MSG_MAIN_AGENT_TOKEN, SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST, SPICE_MSG_MAIN_MIGRATE_END, SPICE_MSG_MAIN_NAME, SPICE_MSG_MAIN_UUID, SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS, SPICE_MSG_MAIN_MIGRATE_BEGIN_SEAMLESS, SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_ACK, SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK, SPICE_MSG_END_MAIN };
1.2客户端—》服务器
enum { SPICE_MSGC_MAIN_CLIENT_INFO = 101, SPICE_MSGC_MAIN_MIGRATE_CONNECTED, SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR, SPICE_MSGC_MAIN_ATTACH_CHANNELS, SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST, SPICE_MSGC_MAIN_AGENT_START, SPICE_MSGC_MAIN_AGENT_DATA, SPICE_MSGC_MAIN_AGENT_TOKEN, SPICE_MSGC_MAIN_MIGRATE_END, SPICE_MSGC_MAIN_MIGRATE_DST_DO_SEAMLESS, SPICE_MSGC_MAIN_MIGRATE_CONNECTED_SEAMLESS, SPICE_MSGC_END_MAIN };
1.3迁移控制
1.4鼠标模式
SPICE协议支持两个鼠标模式:客户端模式及服务器模式。客户端模式下,实际鼠标是客户端鼠标,客户端端发送鼠标位置的显示和服务器发送鼠标形状信息。服务器模式下,客户端发送鼠标的相对移动位置和服务器发送的位置和形状的命令。SPICE主通道被用来发送鼠标模式的控制。
1.4.1 SpiceMouseMode模式
typedef enumSpiceMouseMode { SPICE_MOUSE_MODE_SERVER = (1 << 0),//服务器模式 SPICE_MOUSE_MODE_CLIENT = (1 << 1),//客户端模式 SPICE_MOUSE_MODE_MASK = 0x3 }SpiceMouseMode;
1.4.2 SpiceMsgMainMouseMode结构体描述
SPICE服务器在鼠标模式更改时发送此消息
typedef structSpiceMsgMainMouseMode {
uint32_t supported_modes; //当前支持的鼠标模式
uint32_t current_mode; //当前鼠标模式
}SpiceMsgMainMouseMode;
1.4.3 SpiceMsgcMainMouseModeRequest结构体描述
SPICE客户端发送此消息用来指定鼠标模式。服务器是否接受这个模式是不确定的。只有当收到服务器的回复,客户端才知道实际鼠标模式。
typedef structSpiceMsgcMainMouseModeRequest { uint32_t mode; }SpiceMsgcMainMouseModeRequest;
1.5Main channel init message
SPICE服务器必须发送SPICE_MSG_MAIN_INIT作为第一个消息。在其他任何时候发送都是不被允许的。客户端会回复SPICE_MSGC_MAIN_ATTACH_CHANNELS。获得服务器所支持的通道列表
typedef structSpiceMsgMainInit { uint32_t session_id; //SPICE服务端生成的会话ID,后续通道的链接将发送此ID。 uint32_t display_channels_hint;//可选的预期数量的显示通道。0是无效数值 uint32_t supported_mouse_modes;//支持的鼠标模式 uint32_t current_mouse_mode;//当前鼠标模式 uint32_t agent_connected; //当前SPICE agent的状态。0:断开,1:连接 uint32_t agent_tokens; //发送给SPICE agent的有效许可证,规定了发送信息的数量 uint32_t multi_media_time;//当前多媒体时间。用于同步视频帧 uint32_t ram_hint; //可先的提示帮助确定LZ压缩的大小 } SpiceMsgMainInit;
1.6服务器回应支持通道
为了能够动态的连接服务器通道,SPCIE协议包含了SPICE_MSG_MAIN_CHANNELS_LIST消息。这个消息通知客户端服务器的可用通道。
typedef structSpiceMsgChannels { uint32_t num_of_channels; SpiceChannelId channels[0]; }SpiceMsgChannels;
1.7多媒体时间同步消息
SPICE协议定义了设置多媒体音视频同步的消息。两种方法支持多媒体的支持,第一种方法是根据播放通道上的时间戳,第二种方法使用在主通道SPICE_MSG_MAIN_MULTI_MEDIA_TIME的消息。后一种方法用在不存在音频通道情况下
typedef structSpiceMsgMainMultiMediaTime { uint32_t time; }SpiceMsgMainMultiMediaTime;
1.8Spice agent
SPICE协议定义一组双向通道的消息在SPICE客户端和远程主机上端AGENT的双向通信。SPICE协议只是提供了一种交流的渠道,实际数据传输协议内容是不逃命的。这个通道可以用于各种目的如剪贴板共享、身份验证和显示配置。
1、SPICE客户端接收远程代理通知连接消息
SPICE_MSG_MAIN_INIT或SPICE_MSG_MAIN_AGENT_CONNECTED。
2、远程代理断开消息
SPICE_MSG_MAIN_AGENT_DISCONNECTED。
双向使用令牌机制是为了防止代理消息阻塞主通道。每一方都不允许发送多于对方分配令牌数量的消息,客户端在接收到SPICE_MSG_MAIN_INIT消息的时候获得对方的令牌。后续可以使用SPICE_MSG_MAIN_AGENT_TOKEN获得对方的令牌。服务器得到客户端的令牌初始数量是在SPICE_MSGC_MAIN_AGENT_START消息中,后续SPICE_MSGC_MAIN_AGENT_TOKEN。后续数据的交互使用SPICE_MSG_MAIN_AGENT_DATA和SPICE_MSGC_MAIN_AGENT_DATA。