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。