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块钱的帐清了.
你的贴子我看过了,给你这么说吧,就象生活中一样,假如张三借了你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无关,但原理一样
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函数返回时记录成功的发送数量,用循环的方式发送。
“
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块钱的帐清了.
你的贴子我看过了,给你这么说吧,就象生活中一样,假如张三借了你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无关,但原理一样
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函数返回时记录成功的发送数量,用循环的方式发送。
“
iSent = CMySocket2.Send(LPCTSTR(pBuf),iLen);/*用另一个CAsyncSocket的派生类发送下载到的数据给给客户端,客户端在之前已经连接好了。*/
”
关键是在接受到数据后,上面这一句话是立即转发接收到的数据,在时间上这样做是正确的,是按顺序的一次一次的转送,但你忽略了客户方的网速,也就是说对服务器方的时间来说是正确的,但对客户方和服务器方的时间差来说,这样做是错误的。在客户方因为速度跟不上时,Send函数虽然能够有多次的自动缓冲,但是当Send函数的缓冲区已满时,Send函数的返回数值是-1。
所以你说有些时候没问题,这是因为客户方速度比服务器方快的时候,而有问题的是一些jpg图片,因为有些jpg文件较大,扩大了当客户方速度比服务器方慢的时候的出错概率,所以,jpg文件经常没有了下半截。你又怀疑说,jpg文件的字节数和本来一样啊?这是因为http协议传输时在第一时间传输说明了jpg文件的长度。
解决方法是做一个缓冲区接受和发送数据,在Send函数返回时记录成功的发送数量,用循环的方式发送。