小弟目前有一个程序向位于北美的FTPserver上传数据,但是每到周末性能就会下降,2M左右半小时上传不了,并且经常中断。现在想改经程序,支持断点上传,请各位高手帮忙。
问题1:怎样知道那边的server是否支持断点上传?
问题2:如果支持,实现的思路是什么?
谢谢。
小弟愿拜高人学艺!

解决方案 »

  1.   

    Public  Declare  Function  InternetConnect  Lib  "wininet.dll"  Alias  "InternetConnectA"  _  
           (ByVal  hInternetsession  As  Long,  ByVal  sServerName  As  String,  ByVal  nServerPort  As  Integer,  _  
           ByVal  sUserName  As  String,  ByVal  sPassWord  As  String,  ByVal  lService  As  Long,  ByVal  lFlags  As  Long,  _  
           ByVal  lContext  As  Long)  As  Long  
     
    在做FTP时,    
    手工能PING通FTP服务器,  
    但程序中使用该函数时,为什么常常出现返回值为0,  
    而导致连接不上FTP服务器,    
     
    Public  Declare  Function  ftpOpenFile  Lib  "wininet.dll"  Alias  "ftpopenfilea"  _  
           (ByVal  hFtpSession  As  Long,  ByVal  lFlags  As  Long,  ByVal  lContext  As  Long)  As  Long  
     
    此参数lContext——要打开的文件的描述表标识符,请问具体参数意义,如何设置?  
    该函数是否与断点续传有关?  
     
     
    ---------------------------------------------------------------  
     
    建议查看MSDN,还有什么比它更完整  
    ---------------------------------------------------------------  
     
    Option  Explicit  
     
    '########################################################################  
    '##                                                                                                                                        ##  
    '##                                                        FTPAPI声明                                                            ##  
    '##                                                                                                                                        ##  
    '########################################################################  
     
     
    Public  Const  ERROR_NO_MORE_FILES  =  18  
    Public  Const  ERROR_INTERNET_EXTENDED_ERROR  =  12003  
       
    Public  Const  FTP_TRANSFER_TYPE_BINARY  =  &H2  
    Public  Const  FTP_TRANSFER_TYPE_ASCII  =  &H1  
       
    Public  Const  INTERNET_FLAG_PASSIVE  =  &H8000000  
    Public  Const  INTERNET_FLAG_RELOAD  =  &H80000000  
    Public  Const  INTERNET_FLAG_KEEP_CONNECTION  =  &H400000  
    Public  Const  INTERNET_FLAG_MULTIPART  =  &H200000  
       
    Public  Const  INTERNET_OPEN_TYPE_PRECONFIG  =  0  
    Public  Const  INTERNET_OPEN_TYPE_DIRECT  =  1  
    Public  Const  INTERNET_OPEN_TYPE_PROXY  =  3  
       
    Public  Const  INTERNET_INVALID_PORT_NUMBER  =  0  
       
    Public  Const  INTERNET_SERVICE_FTP  =  1  
    Public  Const  INTERNET_SERVICE_GOPHER  =  2  
    Public  Const  INTERNET_SERVICE_HTTP  =  3  
     
    Public  Const  MAX_PATH  =  260  
    Public  Const  NO_ERROR  =  0  
    Public  Const  FILE_ATTRIBUTE_READONLY  =  &H1  
    Public  Const  FILE_ATTRIBUTE_HIDDEN  =  &H2  
    Public  Const  FILE_ATTRIBUTE_SYSTEM  =  &H4  
    Public  Const  FILE_ATTRIBUTE_DIRECTORY  =  &H10  
    Public  Const  FILE_ATTRIBUTE_ARCHIVE  =  &H20  
    Public  Const  FILE_ATTRIBUTE_NORMAL  =  &H80  
    Public  Const  FILE_ATTRIBUTE_TEMPORARY  =  &H100  
    Public  Const  FILE_ATTRIBUTE_COMPRESSED  =  &H800  
    Public  Const  FILE_ATTRIBUTE_OFFLINE  =  &H1000  
     
    Public  Const  INTERNET_DEFAULT_FTP_PORT  =  21  
    Public  Const  INTERNET_DEFAULT_GOPHER_PORT  =  70  
    Public  Const  INTERNET_DEFAULT_HTTP_PORT  =  80  
    Public  Const  INTERNET_DEFAULT_HTTPS_PORT  =  443  
    Public  Const  INTERNET_DEFAULT_SOCKS_PORT  =  1080  
     
     
    Public  Type  FILETIME  
                   dwLowDateTime  As  Long  
                   dwHighDateTime  As  Long  
    End  Type  
     
    Public  Type  WIN32_FIND_DATA  
                   dwFileAttributes  As  Long  
                   ftCreationTime  As  FILETIME  
                   ftLastAccessTime  As  FILETIME  
                   ftLastWriteTime  As  FILETIME  
                   nFileSizeHigh  As  Long  
                   nFileSizeLow  As  Long  
                   dwReserved0  As  Long  
                   dwReserved1  As  Long  
                   cFileName  As  String  *  MAX_PATH  
                   cAlternate  As  String  *  14  
    End  Type  
     
     
    '连接FTP服务器的操作函数  
     
    '打开连接internet的会话  
    Public  Declare  Function  InternetOpen  Lib  "wininet.dll"  Alias  "InternetOpenA"  _  
    (ByVal  sAgent  As  String,  ByVal  lAccessType  As  Long,  ByVal  sProxyName  As  String,  _  
    ByVal  sProxyBypass  As  String,  ByVal  lFlags  As  Long)  As  Long  
    'sAgent--要调用internet对话的应用程序名  
    'lAccessType--请求的访问的类型,包括:  
    'INTERNET_OPEN_TYPE_PRECONFIG---预配置(缺省)  
    'INTERNET_OPEN_TYPE_DIRECT--直接指向internet  
    'INTERNET_OPEN_TYPE_PROXY--通过代理服务器连接  
    'sProxyName--如果lAccessType被设置为INTERNET_OPEN_TYPE_PROXY,该参数为  
    '代理服务器的名字  
    'sProxyBypass--包含一系列代理服务器地址的字符串  
    'lFlags--会话的选项,可包括下列值:  
    'INTERNET_FLAG_DONT_CACHE--不对数据进行本地缓冲或通过网关服务器缓冲  
    'INTERNET_FLAG_ASYNC--当操作完成时,将同INTERNET_STATUS_REQUEST_COMPLETE  
    '一起进行一个状态回调  
    'INTERNET_FLAG_OFFLINE--只通过永久缓冲进行下载操作  
     
    '打开一个根据连接类型的Internet连接  
    Public  Declare  Function  InternetConnect  Lib  "wininet.dll"  Alias  "InternetConnectA"  _  
    (ByVal  hInternetSession  As  Long,  ByVal  sServerName  As  String,  ByVal  nServerPort  As  Integer,  _  
    ByVal  sUsername  As  String,  ByVal  sPassword  As  String,  ByVal  lService  As  Long,  _  
    ByVal  lFlags  As  Long,  ByVal  lContext  As  Long)  As  Long  
    'hInternetSession--函数InternetOpen()打开Internet对话返回的值  
    'sServerName--要连接的服务器的名称或IP  
    'nServerPort--该连接的Internet端口  
    'sUsername--登录的用户帐号  
    'sPassword--登录的口令  
    'lService--要连接的服务器类型(这里是连接FTP服务器,连接的类型为常数INTERNET_SERVICE_FTP)  
     
    '关闭Internet连接  
    Public  Declare  Function  InternetCloseHandle  Lib  "wininet.dll"  _  
    (ByVal  hInet  As  Long)  As  Integer  
    'hInet--InternetConnect()函数返回的值  
     
    '文件查找操作  
      

  2.   

    '在FTP连接中查找一个文件。在调用此函数后取得第一个文件后,可以接着调用FtpFindNextFile()  
    '获得下一个查到的FTP服务器上的文件。  
    Public  Declare  Function  FtpFindFirstFile  Lib  "wininet.dll"  Alias  "FtpFindFirstFileA"  _  
    (ByVal  hFtpSession  As  Long,  ByVal  lpszSearchFile  As  String,  _  
               lpFindFileData  As  WIN32_FIND_DATA,  ByVal  dwFlags  As  Long,  ByVal  dwContent  As  Long)  As  Long  
    'lpszSearchFile--指向要搜索的文件名。可以通配符*.*的形式。  
    'lpFindFileData--用于装载与找到的文件有关的具体信息  
    'dwFlags--数据传输的方式,通常设置为0,(ASCII方式)  
     
    '继续由FtpFindFirstFile()函数发起的文件搜索操作  
     
    Public  Declare  Function  InternetFindNextFile  Lib  "wininet.dll"  Alias  "InternetFindNextFileA"  _  
           (ByVal  hFind  As  Long,  lpvFindData  As  WIN32_FIND_DATA)  As  Long  
    'hFind--FtpFindFirstFile()函数的返回值  
    'lpvFindData--用于装载与找到的文件有关的具体信息  
     
    '目录操作  
     
    '改变FTP服务器的当前目录。  
    Public  Declare  Function  FtpSetCurrentDirectory  Lib  "wininet.dll"  Alias  "FtpSetCurrentDirectoryA"  _  
           (ByVal  hFtpSession  As  Long,  ByVal  lpszDirectory  As  String)  As  Boolean  
    'lpszDirectory--包含要到达的目录名。可以是相对的或绝对的路径。  
     
    '在ftp服务器上创建目录  
    Public  Declare  Function  FtpCreateDirectory  Lib  "wininet.dll"  Alias  "FtpCreateDirectoryA"  _  
           (ByVal  hFtpSession  As  Long,  ByVal  lpszDirectory  As  String)  As  Boolean  
    'lpszDirectory--包含要创建目录的字符串,可以是一个相对路径或绝对路径  
     
    '取得ftp当前的目录的名字  
    Public  Declare  Function  FtpGetCurrentDirectory  Lib  "wininet.dll"  Alias  "FtpGetCurrentDirectoryA"  _  
           (ByVal  hFtpSession  As  Long,  lpszCurrentDirectory  As  String,  lpdwCurrentDirectory  As  Long)  As  Boolean  
    'lpszCurrentDirectory--存放目录名字的字符串  
    'lpdwCurrentDirectory--目录名字字符串的字节数  
     
    '删除ftp服务器的一个目录  
    Public  Declare  Function  FtpRemoveDirectory  Lib  "wininet.dll"  Alias  "FtpRemoveDirectoryA"  _  
           (ByVal  hFtpSession  As  Long,  ByVal  lpszDirectory  As  String)  As  Boolean  
    'lpszDirectory--要删除的目录名称,可以是相对路径或绝对路径  
     
    '文件操作  
     
    '从ftp服务器上取得一个文件并保存在本地机器上,此函数包括了与从一个FTP服务器中读取一个文件  
    '并在本地保存等操作有关的所有功能  
     
    Public  Declare  Function  FtpGetFile  Lib  "wininet.dll"  Alias  "FtpGetFileA"  _  
    (ByVal  hFtpSession  As  Long,  ByVal  lpszRemoteFile  As  String,  _  
               ByVal  lpszNewFile  As  String,  ByVal  fFailIfExists  As  Boolean,  ByVal  dwFlagsAndAttributes  As  Long,  _  
               ByVal  dwFlags  As  Long,  ByVal  dwContext  As  Long)  As  Boolean  
    'lpszRemoteFile--包含FTP服务器中要读的文件名  
    'lpszNewFile--在本地机器中要创建的文件名  
    'fFailIfExists--当为TRUE时,如果文件已经存在,则调用失败  
    'dwFlagsAndAttributes--文件的属性  
    'dwFlags--文件的传输方式可能包括下列值:  
    'FTP_TRANSFER_TYPE_ASCII--使用可以将控制和格式信息转换到本地对应文件的ASCII传输方式  
    'FTP_TRANSFER_TYPE_BINARY--使用把文件作为一个连续数据流传输的FTP图象传输方式,这种方式  
    '不区别在文件内部数据结构之间的任何分界(如行结束的回车标记)  
    'dwContext--要取回的文件的描述表标识符  
                 
    '把一个文件上栽到FTP服务器上。其中包括了要将一个文件上载到FTP服务器上所有的有关操作  
     
    Public  Declare  Function  FtpPutFile  Lib  "wininet.dll"  Alias  "FtpPutFileA"  _  
    (ByVal  hFtpS
      

  3.   

    Public  Declare  Function  ftpOpenFile  Lib  "wininet.dll"  Alias  "ftpopenfilea"  _  
           (ByVal  hFtpSession  As  Long,  ByVal  lFlags  As  Long,  ByVal  lContext  As  Long)  As  Long  
     
    此参数lContext——要打开的文件的描述表标识符,请问具体参数意义,如何设置?  
    该函数是否与断点续传有关?   ufozq77(ZQ)哥,请你可以说清楚一点好不,lContext是不是我们指定的一个变量来判断一个断点呢,我在写FTP服务器,就是为这个断点问题烦了好几天,到现在还不明白啦