我现在使用VC6.0+WINSOCK写了一个FTP程序,包含服务器和客户端程序,有4000多行代码。
传输几百K的数据没问题,但是用来传输100多M的数据时,效率太低了。
请问应该如何设置SOCKET以及传输与接受方面的代码???
我现在的方法是每次发送2K的数据,发送端就Sleep(200).我如果将发送数据改大的话,就会导致接受端不能完整收到所有数据,可能是接受缓冲区溢出吧!唯一解决办法就是Sleep值调大。能否调用SETSOCKOPT增加缓冲区大小?
目前实验结果:发送3.63M要8分钟。太慢了。
请高手告诉我专业的FTP的传输是如何设置的???

解决方案 »

  1.   

    服务端向客户端发送应答包,客户端继续发送,不需要用sleep.
    数据包大小1k就可
      

  2.   

    我一开始就是1K发送的且不用Sleep,发送几十K的数据就出现问题了。
    是不是要将套接字的缓冲区设置以下 啊?
      

  3.   

    发送数据确认,这不是TCP做的吗?
    难道我还要做吗?!
      

  4.   

    to  acsharplover(斜阳) :
       他有可能用UDP呀.
      

  5.   

    没有啊,我是用TCP的SOCKET。
    你的办法我试试
      

  6.   

    TO windbells(风铃):
    你的办法你试过吗?
    我可帮你试了,比我原来的还慢!
    在TCP层上再加应用层的确认控制,虽然解决了不用Sleep,但每次发送要等待一次TCP传输,若是在网速慢的环境里就更悲惨了!
      

  7.   

    都在说什么呢?既然使用了ftp协议,就要按ftp协议的标准去做,不然怎么兼容一般的ftp程序?什么确认拉,加长度啦,都不符合ftp标准的(FILE STREAM 方式)。其实传数据时不用加长度也不用确认的(长度可以通过LIST,SIZE命令获得),更不用sleep(除非想限速),关键要确保发送端是否把数据完全发送出去了,接收端是否完全接收到了
      

  8.   

    我用TCP也写过FTP传输协议,每次的数据包为1k,收到回复后(8个字节)发第二个包。中间不进行Sleep,速度没有这么慢啊。传送4M文件只需要几秒而已。
    既然是FTP协议,一定要等到对方回复以后才发送下一个包,在套接字缓冲区内根本不会淤积数据的。再说网络传输速度要比硬盘读写数据快多了,你拷贝一个文件也没有那么慢啊!
    我怀疑你的程序可能有问题。
      

  9.   

    thinking999(四方心),你说的是你自己的"ftp"协议吧,ftp标准可不需要什么回复才发下一个包!如果在传送数据时夹杂一些自定义的数据,那已经不是ftp协议了,不能跟通用的ftp软件兼容
      

  10.   

    to thinking999(四方心):
    既然是FTP协议,一定要等到对方回复以后才发送下一个包.
    你是在哪找到这句话的???
    这是TCP的协议规定的啊!而FTP是建立在TCP基础上的,本身包括2个TCP连接:控制连接和数据连接。数据连接是用来临时传输数据的。它自身就在做数据确认工作。我已经说过了在程序中再做这种数据回复确认工作,是在降低效率。TCP就是因为这传输效率才低于UDP的,但保证了可靠性。我用C++Builder中的TClientSocket和TServerSocket组件做过实验,调用它的SendStream()传送3.63M也要5分钟,只比我现在的快1分钟而已。(在相同的环境下)这又做何解释了???
      

  11.   

    用TCP传送控制信息,用UDP传送数据吧
      

  12.   

    to dreamy(Sharping):
    你还是好好看看FTP的协议内容吧!