Amf3协议分析与实现
前沿: 1.Amf3协议分析 AMF3协议包括header和body,组成的数据将作为HTTP的body数据体部分进行发送。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?AMF协议HEX进制表示:
00000000 :00 03 ?00 00?00 01??00 1d 42 61 73 65 53 65 72 76 ? ? ? ? ?BaseServ 00000010 :69 63 ?65 2e 64 6f ? 44 69 73 70 61 74 63 68 54 ?6f ? ? ? ? ? ice.doDispatchTo00000020 :42 61 ?74 63 68 00 ?02 ?2f 31 00 00 00 dc 0a 00 00 ? ? ? ? ? Batch ? ? /1 前两个字节00 03 表示AMF版本,接下来两个字节表示AMF header个数,若header个数为0,则后面不跟header内容,蓝色标识的两个字节00 01是AMF body的个数,之后是AMF body部分。body会先写入AMF的target和response,是字符串形式,response表示请求的标识,target表示请求的类的方法。字符串写入的格式是先写入字符串长度(两个字节)后面跟着字符串内容。 本例中紫色标识的两个字节(00 1d)为target长度,之后跟着target的内容,粉红色的两个字节(00 02)表示response字符串长度。之后就是body的数据体部分。AMF3数据类型有如下几种方式:
class AMF3DataType { public: static const unsigned char Undefined = 0,Null = 0x01,False = 0x02,True = 0x03,Integer = 0x04,Double = 0x05,String = 0x06,XmlDoc = 0x07,Date = 0x08,Array = 0x09,Object = 0x0A,Xml = 0x0B,ByteArray = 0x0C; };数据体的数据组织方式可以参考amfphp实现? http://sourceforge.net/projects/amfphp/。你可以参考其数据组织方式用其他语言实现amf3协议,结合charles抓取数据包进行分析。 2.AMF3协议C++实现 写入缓冲区 ? ?根据之前的AMF3协议的分析
读取缓冲区
(1).读取AMF版本 short version=ReadShort(); (2).读取AMF头得个数 short headerCount=ReadShort(); 若amf3 header个数不为0,则需要解析header.//这一点相当的重要 (3).读取AMF数据体个数 short headerBody=ReadShort(); (4).读取AMF数据体内容 先读取target再读取response 若数据体不为0,解析数据体 发送数据的封装: (1) 由于为了兼容AMF0,AMF3发送数据时, 发送的最外层是AMF0::Array,里面一层是AMF3::ARRAY,amf3Array里面就都是AMF3 data 待续........ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |