高手来看看,再送100分给高手

时间:2023-01-10 13:47:47
可能是缓冲区的使用问题:

http://expert.csdn.net/Expert/TopicView1.asp?id=2675016

6 个解决方案

#1


mark

#2


UP

#3


不用加了,老兄,你先搞清通信的原则再加吧....
你的贴子我看过了,给你这么说吧,就象生活中一样,假如张三借了你1000块钱,他现在来还你,这时你俩如何来传递这些钱呢?事实上你们是通过协议来的,虽然你感觉不到,但这个协议是存在的,可以这样解释:

张三走过来说"还你钱"---这是包头,你听到"还你钱"三个字就知道下面他要传输一些人民币给你
张三又对你说"先还你100"---于是你知道他要给你100块钱
张三拿出100个硬币开始往你手里放,你开始接收并计数,1,2,3...----正常的发送,接收
 数到50的时候,张三说"不好,闹肚子"---此处模拟网络堵塞,即传输延迟
 于是你记下来,现在数到50了,好在他拉完后再回来继续数,
 张三拉了三个小时后回来继续,51,52,53..
 数到80的时候,张三突发心脏病,
 于是你记下来,现在数到70了,好在他抢救完后回来继续数,
 ....
终于数到了100,此时这100块钱的帐清了.

#4


是。

#5


任何的数字通信技术,归根到底是byte流的收/发问题,再低一层就bit流的收发问题.
TCP/IP归根到底就是在计算机之间进行byte流的收发,并通过控制/校验等手段保证信息的正确/完整性.
Socket与TCP/IP无关,但原理一样

#6


楼主,你错误的地方在这一句:

    iSent = CMySocket2.Send(LPCTSTR(pBuf),iLen);/*用另一个CAsyncSocket的派生类发送下载到的数据给给客户端,客户端在之前已经连接好了。*/

关键是在接受到数据后,上面这一句话是立即转发接收到的数据,在时间上这样做是正确的,是按顺序的一次一次的转送,但你忽略了客户方的网速,也就是说对服务器方的时间来说是正确的,但对客户方和服务器方的时间差来说,这样做是错误的。在客户方因为速度跟不上时,Send函数虽然能够有多次的自动缓冲,但是当Send函数的缓冲区已满时,Send函数的返回数值是-1。
所以你说有些时候没问题,这是因为客户方速度比服务器方快的时候,而有问题的是一些jpg图片,因为有些jpg文件较大,扩大了当客户方速度比服务器方慢的时候的出错概率,所以,jpg文件经常没有了下半截。你又怀疑说,jpg文件的字节数和本来一样啊?这是因为http协议传输时在第一时间传输说明了jpg文件的长度。

解决方法是做一个缓冲区接受和发送数据,在Send函数返回时记录成功的发送数量,用循环的方式发送。

#1


mark

#2


UP

#3


不用加了,老兄,你先搞清通信的原则再加吧....
你的贴子我看过了,给你这么说吧,就象生活中一样,假如张三借了你1000块钱,他现在来还你,这时你俩如何来传递这些钱呢?事实上你们是通过协议来的,虽然你感觉不到,但这个协议是存在的,可以这样解释:

张三走过来说"还你钱"---这是包头,你听到"还你钱"三个字就知道下面他要传输一些人民币给你
张三又对你说"先还你100"---于是你知道他要给你100块钱
张三拿出100个硬币开始往你手里放,你开始接收并计数,1,2,3...----正常的发送,接收
 数到50的时候,张三说"不好,闹肚子"---此处模拟网络堵塞,即传输延迟
 于是你记下来,现在数到50了,好在他拉完后再回来继续数,
 张三拉了三个小时后回来继续,51,52,53..
 数到80的时候,张三突发心脏病,
 于是你记下来,现在数到70了,好在他抢救完后回来继续数,
 ....
终于数到了100,此时这100块钱的帐清了.

#4


是。

#5


任何的数字通信技术,归根到底是byte流的收/发问题,再低一层就bit流的收发问题.
TCP/IP归根到底就是在计算机之间进行byte流的收发,并通过控制/校验等手段保证信息的正确/完整性.
Socket与TCP/IP无关,但原理一样

#6


楼主,你错误的地方在这一句:

    iSent = CMySocket2.Send(LPCTSTR(pBuf),iLen);/*用另一个CAsyncSocket的派生类发送下载到的数据给给客户端,客户端在之前已经连接好了。*/

关键是在接受到数据后,上面这一句话是立即转发接收到的数据,在时间上这样做是正确的,是按顺序的一次一次的转送,但你忽略了客户方的网速,也就是说对服务器方的时间来说是正确的,但对客户方和服务器方的时间差来说,这样做是错误的。在客户方因为速度跟不上时,Send函数虽然能够有多次的自动缓冲,但是当Send函数的缓冲区已满时,Send函数的返回数值是-1。
所以你说有些时候没问题,这是因为客户方速度比服务器方快的时候,而有问题的是一些jpg图片,因为有些jpg文件较大,扩大了当客户方速度比服务器方慢的时候的出错概率,所以,jpg文件经常没有了下半截。你又怀疑说,jpg文件的字节数和本来一样啊?这是因为http协议传输时在第一时间传输说明了jpg文件的长度。

解决方法是做一个缓冲区接受和发送数据,在Send函数返回时记录成功的发送数量,用循环的方式发送。