LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1693|回复: 8

关于SOCKET用tcp传送大文件的同步问题

[复制链接]
发表于 2005-6-22 10:42:30 | 显示全部楼层 |阅读模式
是不是存在这样的情况,当一个文件很大的时候,发送端不停的把数据发送出去,结果接收端无法及时读取数据,导致发送端的数据无法再往缓冲写数据或是把之前的数据给覆盖了。反正不能正确接收文件,请问该怎么解决啊。
发表于 2005-6-22 10:52:53 | 显示全部楼层
不会,tcp会自动协调。如果接收端没有ack收到的数据,发送端就会把数据保存在缓冲中。如果缓冲满了,这时应用程序就会被阻塞,直到发送方缓冲出现空余为止。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-22 15:15:32 | 显示全部楼层
今天找一个网络专家问了一下,发送方如果用write就不会又阻塞,要用send才会有阻塞,我之前用的write,待会试验一下。谢谢版主
回复 支持 反对

使用道具 举报

发表于 2005-6-22 21:20:06 | 显示全部楼层
什么网络专家啊……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-23 10:29:45 | 显示全部楼层
看来也不可尽信专家,其实两者都是阻塞的,错误在于思路的错误,在我的实现里,发送方每次读取文件2324个字节,发送的时候加16字节的头然后发送,接收方这样:read(sockfd,buffer,2340);误以为接收方在接收的时候每次也能读取到2340个字节,然后通过头部去判定结束。其实接收方每次接收的数据包不一定的,只是最大字节数为2340而已,结果就不能正确读取头部了。现在存在另外一个问题,接收方接收到的数据小于发送方发送的数据,比如我发送一个30M左右的文件,会少几十、几百甚至上千个字节不等,read就返回0了,并且有一次返回-1,错误码为22。我read(sockfd,buffer,2340);哪里非法参数了?
回复 支持 反对

使用道具 举报

发表于 2005-6-23 21:38:35 | 显示全部楼层
你代码是怎么写的?
回复 支持 反对

使用道具 举报

发表于 2005-6-23 21:39:31 | 显示全部楼层
Post by szkaimi
今天找一个网络专家问了一下,发送方如果用write就不会又阻塞,要用send才会有阻塞,我之前用的write,待会试验一下。谢谢版主

是专家没有讲对?还是专家讲对了,你没有正确的理解专家的话?
ps:一个人既然能被称为专家,水平不可能这么菜吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-24 15:32:15 | 显示全部楼层
是我错了,发送端发完了之后我就关闭socket了,接收端此时还没收完,应该等着接收端来断开连接。专家之前说write和read没有阻塞机制,send和recv才有,他是错的,两种方式都有,只是send 和recv可以传递更多控制信息,在flags里体现。谢谢大家
回复 支持 反对

使用道具 举报

发表于 2005-6-26 14:18:15 | 显示全部楼层
我觉得好象没有这么简单吧?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表