作者o07608 (无良记者)
看板C_and_CPP
标题[问题] read进阵列内数量远小於实际读到数量
时间Wed Dec 7 22:23:33 2016
开发平台(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......
--
1F:→ gcobc12632 :一楼帅哥11/04 22:52
2F:推 maple0935 :二楼帅哥11/04 22:52
3F:推 howar31 :二楼帅哥11/04 22:52
4F:→ howar31 :..11/04 22:52
5F:→ maple0935 :五楼吃屎 11/04 22:53
6F:→ maple0935 :干 可以不要当签名档吗... 11/04 22:53
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.68.155
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1481120617.A.C9A.html
7F:→ stupid0319: 你一次传送1024个字母吗.............. 12/07 22:30
8F:→ o07608: 这样是不好的习惯吗O_O 12/07 22:31
9F:→ stupid0319: 用DD产生的5kb是什麽?全部都是DD DD DD DD这样? 12/07 22:33
> dd if=/dev/urandom of=test5kb bs=5KB count=1
10F:→ o07608: 怎麽变蓝色的o.0 12/07 22:37
※ 编辑: o07608 (140.113.68.155), 12/07/2016 22:45:21
11F:→ x000032001: 如果你的档案有一个byte是0x00 就会视为字串结束 12/07 22:46
12F:→ x000032001: 所以你要用n判断大小 而不是strlen 12/07 22:47
13F:→ x000032001: read/write直接拿来strxxx 就是无止尽的踩地雷游戏 12/07 22:47
14F:→ o07608: 但实际上每段传到receiver的东西大小也小於1024 12/07 22:51
15F:→ o07608: 还是说我不应该用char阵列传东西?那应该要用什麽型态? 12/07 22:52
16F:推 LPH66: 不是不该用 char 阵列, 而是你要知道 char 阵列不等於字串 12/07 22:59
17F:→ LPH66: strxxx 系列函数只能用在是字串的 char 阵列上 12/07 23:00
18F:→ LPH66: 你的资料是从 /dev/urandom 里复制来的所以是二进位资料 12/07 23:00
19F:→ LPH66: 二进位资料不是字串所以不能用 strxxx 系列函数 12/07 23:01
20F:→ LPH66: 所以只有 read 的回传值 n 可信, 你要 write 也要用 n 12/07 23:01
21F:推 LPH66: 话说回来, 既然是在练习 udp 传输, 一次就是固定一个大小 12/07 23:04
22F:→ LPH66: 所以不管传什麽资料都不是 strxxx 出场的时候 12/07 23:04
23F:→ LPH66: 这也就是为什麽 read 这种 general 读取的程式会回传读多少 12/07 23:05
24F:→ o07608: 嗯我懂了,write最後参数我的确不是用n判断 12/07 23:05
25F:→ o07608: 改一下试试看 12/07 23:05
26F:→ o07608: 问题找到了,果然是write参数用错,感谢大家 12/07 23:12