做socket程序,用recv,send这些函数好还是用fread,fwrite好?
是不是recv,send效率低呢?也就是时间长呢? 问题点数:50、回复次数:10Top
1 楼fierygnu(va_list)回复于 2006-03-29 15:31:51 得分 20
用read/write,recv/send都行,不要用fread系列。
效率不低。Top
2 楼Ligaof()回复于 2006-03-29 15:43:18 得分 0
为什么不能用fwrite系列呢?你是担心数据不能被立即写出去吗?可以用fflush()啊。据说流I/O比系统I/O快3倍呢!
另外,fierygnu你是不是一直在网上啊,怎么回答得这么快!Top
3 楼fierygnu(va_list)回复于 2006-03-29 15:48:20 得分 0
闲的时候就在网上:)
fread适合于文件I/O,快是因为有缓冲、预读等机制。虽然都是read/write,但网络接口和磁盘接口的read/write不一样。另外在不同的系统上,FILE结构定义不一样,原来的FILE结构只能使用256以下的描述符值。Top
4 楼Ligaof()回复于 2006-03-29 15:55:35 得分 0
最近我看了一个人的代码,对socket就是用的fread系列,也是可以的吧。
你懂得这么多,真羡慕!Top
5 楼fierygnu(va_list)回复于 2006-03-29 16:45:34 得分 0
不是不可以,就是我上面说的问题:真正的效率和FILE的限制。
此外,要对socket进行各种设置,必须用文件描述符。Top
6 楼bjpy2005(冰城的神话)回复于 2006-03-29 18:21:41 得分 10
不建议使用fread和fwrite不仅考虑效率问题。在很多异构系统通过网络互连起来,在一个系统上写的数据,在另一个系统上读,在这种情况下,这两个函数就不能正常工作,其原因是:
1。在一个结构中,同一成员的位移量可能随编译程序和系统的不同而异(由于不同的对准要求)。在某些编译程序有一选项,允许紧密包装结构(节省存储空间,而运行性能有所下降)或准确对齐,以便在运行时易于存取结构中的各成员,这意味着即使在单一系统上,一个结构的二进制存放方式也可能因编译程序的选择项而不同。
2。用来存储多字节整数和浮点值的二进制格式在不同系统结构间也可能不同。Top
7 楼fierygnu(va_list)回复于 2006-03-29 18:25:35 得分 0
fread和fwrite也是基于流的,不存在这些问题。这些问题需要应用自己考虑,或者说属于应用层协议的范围。Top
8 楼tb01412(tb)回复于 2006-03-29 22:41:20 得分 20
做socket程序,用recv,send这些函数好还是用fread,fwrite好?
一般说来是用recv,send,read,write等函数,用fopen系列函数是在C库中有缓冲的,一般用于对文件进行操作,而用read系列函数在C库中无缓冲,用于设备级读写。
缓冲有几个概念:
一是应用级缓冲,就是在C库中的缓冲,比如在LINUX中的printf中如果不加\n它就暂不输出,道理是一样的。
二是块设备高冲缓冲,这是在内核磁盘高速缓冲区的概念
三是硬件缓冲,比如CACHE,外围设备在硬件上的缓冲等,不过不用了解到这个层面上去Top
9 楼LoveCreatesBeauty(lovecreatesbeauty.googlepages.com)回复于 2006-03-30 01:23:44 得分 0
fierygnu(va_list) ( ) 信誉:105 2006-3-29 15:31:52 得分: 0
> ...
> 效率不低。
:- )
fierygnu 真的知道很多知识,偶也很羡慕Top
10 楼Ligaof()回复于 2006-03-30 08:51:46 得分 0
好了,讨论了这么多,这个问题可以结帖了吧!Top




