[问题] read进阵列内数量远小于实际读到数量

楼主: o07608 (无良记者)   2016-12-07 22:23:33
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)

问题(Question):
我的网络程式设计功课,需要写一个UDP sender/reciever来传资料
我想在sender open指定档案后,一段段read进阵列里传到reciever,write进另一个档案
但当我在read时,假设:
char buf[1024];
n = read(fd, buf, 1024); //fd指向已开启档案,大小5KB
把n和strlen(buf)印出来
n会是1024没错,但strlen(buf)却远小于1024
传到receiver write进新开的档案之后,新的档案大小也会小很多
喂入的资料(Input):
用dd随机产生的5kb档案
预期的正确结果(Expected Output):
从sender端完美复制到reciever端
错误结果(Wrong Output):
read进阵列的每段资料都差很多
程式码(Code):(请善用置底文网页, 记得排版)
http://codepad.org/HGM1mFF7
如有需要完整的sender程式码,我再另行附上
补充说明(Supplement):
网络程式设计作业老是会出现神奇的bug......
作者: stupid0319 (征女友)   2016-12-07 22:30:00
你一次传送1024个字母吗..............
楼主: o07608 (无良记者)   2016-12-07 22:31:00
这样是不好的习惯吗O_O
作者: stupid0319 (征女友)   2016-12-07 22:33:00
用DD产生的5kb是什么?全部都是DD DD DD DD这样?
楼主: o07608 (无良记者)   2016-12-07 22:37:00
怎么变蓝色的o.0
作者: x000032001 (版废了该走了)   2016-12-07 22:46:00
如果你的档案有一个byte是0x00 就会视为字串结束所以你要用n判断大小 而不是strlenread/write直接拿来strxxx 就是无止尽的踩地雷游戏
楼主: o07608 (无良记者)   2016-12-07 22:51:00
但实际上每段传到receiver的东西大小也小于1024还是说我不应该用char阵列传东西?那应该要用什么型态?
作者: LPH66 (-6.2598534e+18f)   2016-12-07 22:59:00
不是不该用 char 阵列, 而是你要知道 char 阵列不等于字串strxxx 系列函数只能用在是字串的 char 阵列上你的资料是从 /dev/urandom 里复制来的所以是二进制资料二进制资料不是字串所以不能用 strxxx 系列函数所以只有 read 的回传值 n 可信, 你要 write 也要用 n话说回来, 既然是在练习 udp 传输, 一次就是固定一个大小所以不管传什么资料都不是 strxxx 出场的时候这也就是为什么 read 这种 general 读取的程式会回传读多少
楼主: o07608 (无良记者)   2016-12-07 23:05:00
嗯我懂了,write最后参数我的确不是用n判断改一下试试看问题找到了,果然是write参数用错,感谢大家

Links booklink

Contact Us: admin [ a t ] ucptt.com