今天写Walker的网络传输, 在传输文件时, 出现一点问题。
1.如果传输文本文件, 只要一个字节一个字节地对应传送过去即可。
2.如果传输二进制文件,也只要一个字节一个字节传送过去就可以。。
读写文件,都是以字节流的形式。最后用vim打开时,都是一个字节 转换 成一个字符出来给人看。
这次出现的问题是这样的,要实现以下一个功能:
传输一行数据,数据格式是 <string int> 来表示一个 ip地址,与其出现的次数。如 192.168..1.1 2,表示这个IP地址出现了两次。在网络中,有下面有几种传输方式:
1(有问题).先传一个string, ( strIp.size() bytes),一个空格(1byte), int(4bytes), 换行符(1bytes). 文件能传,接收文件的时候,能以字符全部接收过来,但是因为不知道其格式,用文本文件来显示的话, 字符串可以正常显示, 但是4个字节的int, 显示出来却不对了。
解决方法:
1(推荐,)在发送的时候,将int也转换成字符来发送(sprintf)~~ , 接收到的文件直接就能看了, 要用时,再转成整型.(atoi)
2 (不推荐) 自定义协议, 传送文件的时候,额外定义协议, 比如 len string 4 int, 表示先读个len,然后读len个字节存为字符串,再读个len=4,再读4个字节存为int.这种方法比较不推荐,因为我接收文件的方式已经写好,是TCP无边界,一次读4K的了~~ 去改无限麻烦。
总结:网络传输中的文件,要把每个数据都看成字符,而不要还有整数之类的看法。
把上面的问题,全部看成字符,收到所有文件后,要进行额外处理,再去慢慢转换。
注: 二进制文件 与 文本文件的区别, 编码不同。如果 int n = 10; 文本文件只要2个字节,二进制文件则是 sizeof(int) = 4个字节。