赞
踩
官方参考:https://mp.weixin.qq.com/s/lpWEv3NCLkfKmtzKJ5lGzQ
FastDFS采用二进制TCP通信协议。一个数据包由 包头(header)和包体(body)组成。包头只有10个字节,格式如下:
@ pkg_len:8字节整数,body长度,不包含header,只是body的长度
@ cmd:1字节整数,命令码
@ status:1字节整数,状态码,0表示成功,非0失败(UNIX错误码)
代码如下,我们看到 cmd 作者用了 char型,char只有一个字节,
char 类型也是一个标准的整数类型。但是,仅有一个单词的类型名称 char,既可以是 signed char 的同义词,又可以是 unsigned char 的同义词,这由编译器决定。因为这是由所采用的实现版本自行选择的,所以严格地说,char、signed char和unsigned char 是三种不同的数据类型。
如果程序会用到的 char 值包括小于 0 或大于 127 的情况,则应该使用 signed char 或者 unsigned char,而不是 char。
标准整数类型常见存储空间大小和取值范围
类型 存储空间大小 最小值 最大值
char (与 signed char 或 unsigned char 相同)
unsigned char 1个字节 0 255
signed char 1个字节 -128 127
typedef struct
{
char pkg_len[FDFS_PROTO_PKG_LEN_SIZE]; //body length, not including header
char cmd; //command code
char status; //status code for response
} TrackerHeader;
因此,作者的指令码都在 0-127之间。
数据包中的类型说明:
1) 整数类型采用网络字节序(Big-Endian),包括4字节整数和8字节整数;
2) 1字节整数不存在字节序问题,在Java中直接映射为byte类型,C/C++中为char类型;
3) 固定长度的字符串类型以 ASCII码0结尾,对于Java等语言需要调用trim处理返回的字符串。变长字符串的长度可以直接拿到或者根据包长度计算出来,不以ASCII 0结尾。
tracker_proto.h 中定义所有命令码。
下面将列举client发送给FastDFS server的命令码及其body(包体)结构。
FDFS_PROTO_CMD_ACTIVE_TEST:激活测试,通常用于检测连接是否有效。客户端使用连接池的情况下,建立连接后发送一次active test即可和server端保持长连接。
#请求body&#
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。