读书人

AMF3协议的C++打包

发布时间: 2012-07-27 11:03:00 作者: rapoo

AMF3协议的C++封装

? ? 新的页游采用AMF3协议作为通讯协议。 网上相当一部分人说找不到AMF3协议的C++实现,不过其实并非如此。

libamfx?只支持AMF0不支持AMF3

amf3cplusplus?是国人实现的,仅实现windows平台版本,支持除undefine/xmldoc/xml外其他AMF3数据类型。 可能在一些情况下能满足你的需求。

?

? ? 但我要在unix/linux平台下用, 所以amf3cplusplus不能直接满足我的需求。 c++ rtmp server?里其实已有了AMF3协议的比较全面完善的实现, 不过对于只需要其中的AMF3协议解析部分的人,需要一些把适当的代码抽取出来的工作。?

我现在把我抽出来的代码 打包了一下共享出来, 可以帮助其他有需要的人省点功夫。代码采用cmake进行build管理。?

? ? 其中的VBuffer.h 和VBuffer.cpp 是我加进去的, 不是c++ rtmp server里原来有的。 ?

VBuffer的特点是: 一个VBuffer对象可以attach(挂载)进外部其他地方分配的内存, 所以比较方便和各种网络库结合使用, 不过同一个VBuffer对象,要么只用于连续Read的功能,要么只用于连续Write的功能,若对同一个

VBuffer对象既Read又Write, 则可能会发生混乱。

而与之对比, CRTMPServer的 IOBuffer类(common\src\utils\buffering\iobuffer.h)则是个可同时写和读的缓冲区管理类。我不用它而改用VBuffer主要是因为VBuffer比较方便和其他网络库结合使用的原因。 总的来说c++ rtmp server的代码质量感觉比较高, 它的其他部分有时间也可以研究学习一下.?

? ? 下面是我结合使用陈硕的muduo网络库?进行AMF3协议解析的一小段例子:

?

    1 楼    Solstice    2012-02-15              你这个 onMessage() 有问题,不能正确处理TCP分包,比方说一个字节一个字节地收到消息,又比方说一次收到两条消息。
正确的做法可参考 http://code.google.com/p/muduo/source/browse/trunk/examples/asio/chat/codec.h
关键是预先判断长度,然后在读完一整条消息后再retrieve(). 2 楼 wooce 2012-02-16 没想到陈硕来关注了。谢谢意见。
muduo库我不是很熟悉,原先是只求快点做出演示就好,不过既然发出来了就是该严谨些,这就按你的意见改好了 3 楼 Solstice 2012-03-02 wooce 写道没想到陈硕来关注了。谢谢意见。
muduo库我不是很熟悉,原先是只求快点做出演示就好,不过既然发出来了就是该严谨些,这就按你的意见改好了
现在的写法还是错的,比如一条消息是20字节(含header),现在第一次只收到10字节。 4 楼 evilshadow 6 小时前 hi,请问你可以提供一个基于该库的详细点的AMF封包序列化和反序列化过程的例子吗?

读书人网 >C++

热点推荐