vb winsock局域网发送文件出错

我编了一个局域网发送文件的小程序使用tcp协议思路如下:客户端要求发送,服务器端以byte形式读取文件,并开始发送第一个数据段(4K),客户端接到数据段,写入文件,然后发... 我编了一个局域网发送文件的小程序
使用tcp协议

思路如下:
客户端要求发送,服务器端以byte形式读取文件,并开始发送第一个数据段(4K),客户端接到数据段,写入文件,然后发送一个nextB字符串,要求服务器端发送下一个数据段,。。。。
服务器端发现byte全部发送完毕,会发送一个‘the end’数据,这时文件发送完成了。

我编写好代码后,在自己电脑上建服务器和客户端,收发文件都没有问题,可见代码应该没有问题。
可是我在局域网发送文件的时候,客户端能够接收到数据,可是接收到1M左右就不能继续接收下去了,不知道怎么回事?

难道是因为网络原因?不对,我们网络肯定没问题!而且试了很多次都是这样!
或者是因为内存原因,客户端接收数据不及时,这个数据段还没写入文件那个数据段又来了,这样搞混了?
好像也不对啊,那到底是怎么回事?
各位有没有遇到过这种情况?该如何解决?
展开
 我来答
爱栀竹的人
2011-12-05 · TA获得超过1352个赞
知道大有可为答主
回答量:1743
采纳率:0%
帮助的人:1001万
展开全部
据我的观察发现,如果是连续多次发送,每次发送数据段不能超过 1000字节。
这里有一个累积效应,累积到一定次数,会收到的出错的数据;
每次发送的字节数越多,引发累积造成错误的次数也越小。
曾经使用1200字节发送,大概累积发送8M数据就出错了...
当我调到每次发送1000字节时,未再观察到出错。

有时候发送了2个用户包,而对方却收到了1个用户包,因为连续的senddata,在
socket线程的一个检测周期就向socket的buf放了2批数据,当然他认为是1批啊,
他会拆分成1500一个ip包(以太网的MTU,最大传送单元),在对方
的socket线程里面,他在一个检测周期发现了数据于是做一个包触发一个事件给vb一个通知,
不过这里面还多了个判断而已,就是如果这个包太大了(大于8k),他就给2个或2个以上事件
这也是为什么接收包一次只能8k的原因,如果用户在2次发送的过程中加了doevents,
这个时候呢,呵呵,提交了一披数据给socket buf,然后doevents,让系统检测下还有没有
消息队列没处理。。。这当然需要时间,就坏事在这个地方了,过了这个时间,又提交了2批的
socket buf, 虽然doevents要的时间很小,不过比起socket buf的一次检测时间(定时器)
还是大的, 所以他就发送了2个用户包出去拉(这2个用户包的间隔时间就是doevents的时间
+-检测时间),考虑网络稳定情况下,对方接收到2个包的间隔也是这个时间,但对方的接收检
测时间跟发送方的发送检测时间相同,于是就认为是接收到了2个包
更多追问追答
追问
好像有道理,我是每次发送3072字节的,老是出错,我把它改成1024了,发送一个125M的视频没有出错,中间有停顿了几次每次0.5秒左右,但是最后还是发送成功了!只是速度有点慢,大约0.8M/s,请问有什么办法可以让他快点吗?是不是每次发送的数值越大(只要不出错)传送速度越快?
追答
理论上当然包越大速度越快。还有就是使用多线程。
惟妙惟肖且透亮灬福星p
2011-12-05 · 超过24用户采纳过TA的回答
知道答主
回答量:85
采纳率:0%
帮助的人:56.7万
展开全部
可能你服务器设置的端口和别的应用程序冲突了吧。你改下端口试下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式