computerzanz 发表于 2009-10-25 16:08

socket 下利用send recv 如何实现完整文件的读取传送

想法:服务器端利用send函数,一行一行的发送文本,浏览器段利用recv函数接受一行,然后解析
问题1:想法可不可行?如何判断服务器断数据发送完毕?网上看了点知识,对socket缓冲区不是很理解?这个socket缓冲区是不是就是send函数里的buff?
问题2:为了实现本想法,是不是需要客户端不停send才能不停的接受?
买的unix网络编程还没到,所以问比较白痴的问题,谢谢大家!!


ps:客户端用了curse库,接受到的数据打印输出后有部分乱码和问号,有时候一次运行出现带问号的乱码,再运行一次就出现:connectiong reset by peer ,对此大家有什么意见??

谢谢~~

computerzanz 发表于 2009-10-25 21:49

回复 #1 computerzanz 的帖子

自己顶~~

computerzanz 发表于 2009-10-26 16:06

回复 #2 computerzanz 的帖子

55555,大家随便说点自己的想法把,别光看不说阿

duanjigang 发表于 2009-11-02 17:30

参考下这个帖子:
http://bbs.chinaunix.net/viewthread.php?tid=1274290&extra=&page=1
可能其中有些许问题,不能希望那能给你做个示范。
PS:现在牵扯到通讯的,我都不习惯socket了。直接ICE上,比较省事,让开发人专注于业务而不是通讯过程

buaadallas 发表于 2009-11-02 20:34

回复 #1 computerzanz 的帖子

这是一个简单的socket编程问题,socket只是提供一个连接方式而已,具体如何实现传输要自己设计。
比如如何判断发送完毕,很简单,你循环调用recv,知道recv返回的值为零的时候,就表明服务器没有发送任何数据了,这时候发送完毕。
实现的方法有很多,可以使用fork或者select,推荐使用select来进行socket编程,这样系统不会阻塞,而且服务器发送完文本以后,可以再发一个完毕信号给客服端,比如字符串“Finished”,这样当客户端接收到数据以后,先与字符串“Finished”进行比较来判断是否发送完毕。

至于socket的缓冲区和send里面的buffer不是一个概念,你可以把socket看成一个FIFO,服务器往fifo里面写东西,客户端从fifo里面读数据,一个不断的写,一个不断的读,如果一方停止写,那么另一个之后将读不到任何东西。那么这个fifo有多大呢,一般默认是64k,这个就是socket的缓冲区,当然也可以自己更改这个缓冲区的大小。但是send函数里面的buffer参数一般来说都比64k要小很多,这个buffer的大小需要根据自己的实际情况来设置,如果文本不是很大的话,一般不要设置得太大,以免发生数据丢失的情况。

computerzanz 发表于 2009-11-04 14:44

回复 #5 buaadallas 的帖子

谢谢!!
自己实现了 文件从传送,原理和你说的一样
谢谢

jueduiyingxiong 发表于 2013-01-23 11:25

为什么要这样做呢?不觉得麻烦,而且效率不搞么?用sendfile发送整个文件,发送之前加上一个长度,就OK了!!!

cxytz01 发表于 2013-03-21 21:33

最简单的方法,

如果是TCP方式,服务器端发送玩文本文件,就直接close(fd),客户端一旦read返回0,就证明了服务器发送完毕。
页: [1]
查看完整版本: socket 下利用send recv 如何实现完整文件的读取传送