基于TCP的文件传输、
服务端:
用send函数发送一定字节数据(发送缓冲区假设为8192B),在等待客户端回复确认(缓冲区假设为256)。
客户端:
用recv函数接收服务端所发数据(接收缓冲区假设为8888B),并向服务端发送在线确认信息(发送缓冲区假设为256B)。
完成后,由服务端发送信息通知客户端。
现在问题是,文件可以正常传输,但时间一长就出问题,客户端崩溃!
经过调试发现是客户端缓存溢出了!
第一次,3.71M的文件,以上面缓存标准测试,下载到3.70M时客户端,和服务端都处于接收数据状态,都在执行Recv函数;
第二次,425M文件测试,如以上面为标准,下载到11左右客户端崩溃!同数据再测试,依旧,调试,发现堆栈溢出!
第三次,仍然是425M文件测试,服务端缓冲区设为1510,等下载到8M左右,依旧,调试,发现堆栈溢出!
第四次,仍然是425M文件测试,测试客户端缓冲区大小设为88888,能够下载到35M左右,进入调试,问题同上,堆栈溢出!
第五次,仍是上文件,缓冲区设为888888,文件可下载完成!
请问各位高手,这究竟是什么原因?谁能帮我解释下?谢谢
同时附个人见解:
个人认为是缓冲溢出!求解
对于缓冲区而言,客户端接收大小的缓冲区,8888已经大于服务端的8192,应该不会出问题了,再用FTP/HTTP协议编程我就这么设置的,没有出错。这次只不过是自己写网络通信,没用自带以集成好的函数而已。
如果说TCP/IP缓冲区溢出,应该不会因为RECV/SEND函数体里的相关协议操作已经作了(比如,TCP阻塞、滑动、校验等),难道还用我们操心???数据准确性应该应该已经有保证了吧?

解决方案 »

  1.   

    我分享一下我写文件传输时遇到的问题吧,
    当时我没写客户端确认,可以正常传输,音乐图片都可以,
    如果char sendbuf[]开的太大,会导致传输失败,
    最优的大小是让send的数据大小小于1452B,好像是这个数字,上网查的,
    这样可以速度最快
      

  2.   

    我分享一下我写文件传输时遇到的问题吧,
    当时我没写客户端确认,可以正常传输,音乐图片都可以,
    如果char sendbuf[]开的太大,会导致传输失败,
    最优的大小是让send的数据大小小于1452B,好像是这个数字,上网查的,
    这样可以速度最快
      

  3.   

    顶啊。
    还是不行啊 问题一样。。这次设置服务端了
    888B,仅能下133.5K左右
    源码不好上,我是三种下载方式在一起比较多,发工程。
    这是工程资源:http://download.csdn.net/source/2763701