返回信息流求问一个问题
现在需实现一个功能
android通过socket连续发送四部分内容:一个整型变量和三个文件到服务器端(c++实现,通过socket接收)
因为存在大小字节序的问题,所以对于基本数据类型的传输,采用转换为字节数组后,在客户端改变字节序再发送的方式
发送文件分成三个字节数组进行发送:先发送文件名的字节数组,再发送文件大小的字节数组,最后发送文件内容的字节数组
android端发送的字节数组通过log检查过没有问题
c++接收字节数组代码如下:
int name_size = recv(client_sockfd, buffer, MAX_BUFFER, 0);
int len_size = recv(client_sockfd, buffer, MAX_BUFFER, 0);
int data_size = recv(client_sockfd, buffer, MAX_BUFFER, 0);
举例,android发送的某个文件,其文件名,文件大小,文件内容的字节数组长度分别为:10,8,400(个字节)
现在遇到的问题是:
服务器端接收文件时能够完全接收到发送过来的所有字节,但是无法区分这些内容
比如可能name_size = 418(10+8+400) , len_size = 0, data_size = 0
也可能 name_size = 18(10+8) , len_size = 400, data_size=0
麻烦问一下这个问题该怎么解决~
这是一条镜像帖。来源:北邮人论坛 / cpp / #90369同步于 2016/2/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
java通过socket发送多个文件,c++接收
andand16
2016/2/29镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
协议设计!协议设计!协议设计!重要的事情要说三遍。
如果用二进制格式,规定每个字段的长度以及字节序。比如:
以下所有数值均为无符号big endian整数。ContentX是文件内容,长度等于与之对应的FileX中的FileLen的值。
数据流:
+-------------+------------------+------------------+------------------+----------+----------+----------+
| IntVar (4B) | File1 (FileDesc) | File2 (FileDesc) | File3 (FileDesc) | Content1 | Content2 | Content3 |
+-------------+------------------+------------------+------------------+----------+----------+----------+
FileDesc:
+------------------+------------------------------+--------------+
| FileNameLen (4B) | FileName (FileNameLen bytes) | FileLen (8B) |
+------------------+------------------------------+--------------+
如果用文本格式,规定编码方式,以及各个字段之间的分隔符。比如:
以下代码中,<xxx>连同两侧的尖括号,表示字段,应替换成实际内容。所有文本按UTF-8编码。
\r\n表示先发送“回车”符(unicode代码为13),再发送“换行”符(unicode代码为10)
语法采用EBNF形式。花括号括起来的部分为重复0次或多次。
代码中的空格不是实际传输空格,实际传输的空格用' '表示。
<数据流> ::= <头> \r \n <二进制数据>
<头> ::= {<行> \r \n}
<行> ::= <字段名> ':' <值>
其中,字段名由英文大写字符、小写字符、数字、横线'-'构成。
值可以是字符串值,也可以是整数值。字符串值不能包含\r和\n。值为十进制整数。值从冒号':'之后开始(不含冒号),直到行尾的\r\n(不含)为止。
头必须包括7个字段,顺序不限,字段名和值分别是:
IntVar 整数
FileName1 字符串
FileName2 字符串
FileName3 字符串
FileLen1 整数
FileLen2 整数
FileLen3 整数
二进制数据包含三个文件的内容,按第一、二、三个文件的顺序传输。长度分别由对应的FileLenX规定。
如果设计到这一步,应该歧义问题就解决了。楼主也设计自己的协议吧。
666~~
[ema11]
我采用二进制的方式试试
【 在 nuanyangyang 的大作中提到: 】
: 协议设计!协议设计!协议设计!重要的事情要说三遍。
: 如果用二进制格式,规定每个字段的长度以及字节序。比如:
: [code=text]
: ...................
顶暖神,你要设计自己的通信协议
以区分出那个数据属于 名字,大小,内容……
自己的协议自由度比较高
你也可以在考虑一下,数据包有没有完整发过来,然后加入校验码,万一发送过程出错可以请求重发(不知道socket底层通信有没有实现重发机制)
然后考虑到你的数据包有可能被别人截获,被别人读取出你的文件,这时候你是不是可以再给数据加密解密?
然后怎么加密解密安全性较高?
对称性还是非对称性?
……
恩恩,谢谢~受教了~
【 在 FromMars 的大作中提到: 】
: 顶暖神,你要设计自己的通信协议
: 以区分出那个数据属于 名字,大小,内容……
: 自己的协议自由度比较高
: ...................