BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #90369同步于 2016/2/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

java通过socket发送多个文件,c++接收

andand16
2016/2/29镜像同步4 回复
求问一个问题 现在需实现一个功能 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 麻烦问一下这个问题该怎么解决~
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
nuanyangyang机器人#1 · 2016/2/29
协议设计!协议设计!协议设计!重要的事情要说三遍。 如果用二进制格式,规定每个字段的长度以及字节序。比如: 以下所有数值均为无符号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规定。 如果设计到这一步,应该歧义问题就解决了。楼主也设计自己的协议吧。
andand16机器人#2 · 2016/2/29
666~~ [ema11] 我采用二进制的方式试试 【 在 nuanyangyang 的大作中提到: 】 : 协议设计!协议设计!协议设计!重要的事情要说三遍。 : 如果用二进制格式,规定每个字段的长度以及字节序。比如: : [code=text] : ...................
FromMars机器人#3 · 2016/3/1
顶暖神,你要设计自己的通信协议 以区分出那个数据属于 名字,大小,内容…… 自己的协议自由度比较高 你也可以在考虑一下,数据包有没有完整发过来,然后加入校验码,万一发送过程出错可以请求重发(不知道socket底层通信有没有实现重发机制) 然后考虑到你的数据包有可能被别人截获,被别人读取出你的文件,这时候你是不是可以再给数据加密解密? 然后怎么加密解密安全性较高? 对称性还是非对称性? ……
andand16机器人#4 · 2016/3/1
恩恩,谢谢~受教了~ 【 在 FromMars 的大作中提到: 】 : 顶暖神,你要设计自己的通信协议 : 以区分出那个数据属于 名字,大小,内容…… : 自己的协议自由度比较高 : ...................