一种基于boost库对TCP协议的封装

目录

  • 1、一点背景知识
    • 1.1 RFB协议
    • 1.2 VNC协议
    • 1.3 H264
    • 1.4 H264编码流对RFB封装的实现
  • 2、具体实现
    • 2.1 UML图
    • 2.2 时序图
    • 2.3 一些说明

1、一点背景知识

1.1 RFB协议

RFB ( Remote Frame Buffer 远程帧缓冲) 协议是一个用于远程访问图形用户界面的简单协议。由于 RFB 协议工作在帧缓冲层,因此它适用于所有的窗口系统和应用程序,如 Windows 3.1/95/NT 和 Macintosh 等。
RFB协议最显著的特点在于,它只负责从帧缓冲区中获取显示更新及Server端和Client端的数据交互,使客户机处理的任务尽可能减少。RFB协议对于客户端是无状态的。

1.2 VNC协议

VNC(Virtual Network Computing)是基于RFB(Remote Frame Buffer)协议进行通信,是一个基于平台无关的简单显示协议的超级瘦客户系统。VNC viewer就是实现VNC协议一个常用的软件。

1.3 H264

H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式。H264常用于视频编码,有关H264的介绍网络上比较好的博客有雷神的这个专栏。

1.4 H264编码流对RFB封装的实现

H264能实现对RFB封装的是基于H264的分层结构和RFB的可扩展性。具体做法是在系统服务器端初始化时扩展自己的编码方式到RFB支持的编码列表中,然后将RFB协议的FrameBufferUpdate消息头和待编码矩形结构信息添加到H264编码流之前。

2、具体实现

2.1 UML图

给出一张核心类关系图
一种基于boost库对TCP协议的封装_第1张图片

2.2 时序图

main.cpp H264Protocol.cpp Server.cpp ServerTcpConnection.cpp TcpConnection.hpp TcpConnection.cpp SessionHandler.cpp AviChannel.cpp Connection.cpp Session.cpp Channel.cpp KeyChannel.cpp MouseChannel.cpp MotionChannel.cpp SettingChannel.cpp QemuChannel.cpp RawDataChannel.cpp init() 分配内存 new Server() Start() DoAccept() Start() AsyncRead() HandlePreface() 虚线箭头代表回调走向 HandleAuthentication() StartParser() WaitForMessage() CreateSession() new SessionHandler() Start() start() new thread() h264EncodeThreadFunc() encodeH264() SendH264() SendMessage() 经过包解析,由SessionHandler 来处理每个channel里的数据 这里的流程经过简化 ParseRecvMsg() OnMessage() GetKeyChannel() HandleBuffer() OnKeyEvent() GetKeyChannel() HandleBuffer() OnMouseEvent() GetMotionChannel() HandleBuffer() OnMotionEvent() GetSettingChannel() HandleBuffer() OnSettingEvent() GetQemuChannel() HandleBuffer() OnQemuEvent() GetRawDataChannel() HandleBuffer() OnRawDataEvent() main.cpp H264Protocol.cpp Server.cpp ServerTcpConnection.cpp TcpConnection.hpp TcpConnection.cpp SessionHandler.cpp AviChannel.cpp Connection.cpp Session.cpp Channel.cpp KeyChannel.cpp MouseChannel.cpp MotionChannel.cpp SettingChannel.cpp QemuChannel.cpp RawDataChannel.cpp

2.3 一些说明

对初级socket编程来说,我们通常创建好socket就可以开始收发数据了。在本文中,一个socket被抽象成多路connection,一路connection里面分了许多channel,如:KeyChannel、KeyChannel等等。在协议设计的时候,就需要把每一路channel占用第几字节到第几字节定义好,服务器和客户端根据这个定义来组包和解包。由于编码的底层基于boost库里的TCP实现,所以仍然是对TCP协议的封装。

你可能感兴趣的:(收获,tcp/ip,网络协议,网络)