当前位置: 代码迷 >> VC >> FTP 上传文件的有关问题,
  详细解决方案

FTP 上传文件的有关问题,

热度:1280   发布时间:2016-05-05 00:17:49.0
FTP 上传文件的问题,急!
服务器端是用serv_u搭建的,客户端是自己用C++写的,在局域网内上传文件都没问题,但是如果服务器放到广域网上,用外网IP的话,上传文件时,一执行到PutFile,程序就停住了,一直过了300秒(FTP默认等待时间),返回错误12002(等待超时),在服务器上可以看到已经创建了所上传的文件,但是大小为0.下面是上传的相关代码,请高手帮我看一下到底是什么原因,谢谢!
BOOL CDecoder::UpdFile(LPCTSTR localPath,LPCTSTR serverIP,int port,LPCTSTR userName,LPCTSTR pwd,LPCTSTR remotePath,LPCTSTR fileName)
{  
    CString defServerName =serverIP;//"hexun.com";//服务器名
     CString defObjectName =remotePath;//"/upload.jsp";//保存的地址
    CInternetSession Session;
    CFtpConnection *pFtpConnection = NULL;
    TCHAR szError[MAX_PATH];
    BOOL bSuccess = TRUE; 
    CString strDebugMessage;

try
{
pFtpConnection = Session.GetFtpConnection(defServerName,userName,pwd,port);
    bSuccess = pFtpConnection->SetCurrentDirectory(defObjectName);
if(bSuccess==false)
{
bSuccess = pFtpConnection->CreateDirectory(defObjectName);
bSuccess = pFtpConnection->SetCurrentDirectory(defObjectName);
}

//pFtpConnection->SetOption
bSuccess = pFtpConnection->PutFile(localPath,fileName,FTP_TRANSFER_TYPE_ASCII);
DWORD dw = GetLastError(); 
if  (GetLastError()  ==  ERROR_INTERNET_EXTENDED_ERROR)
        {
             CHAR szError1[256];
             DWORD dwErrorSize = 256;
             DWORD dwLastErrorMsg;
             InternetGetLastResponseInfo(&dwLastErrorMsg,szError1,&dwErrorSize);            
             CString m_strTmperror = szError1;
        }
pFtpConnection->Close(); 
return bSuccess; 
}
catch (CException* e)
    {
e->GetErrorMessage(szError, MAX_PATH);
e->Delete();
AfxMessageBox(szError);
bSuccess = FALSE;
    } 
 
}
------解决方案--------------------
不是特别确定这个API是怎么发送文件的。FTP有两种连接方式,主动和被动,都很容易受到防火墙设置的影响。

你可以用Network Monitor抓一下包,看看到底你的客户端使用的是哪种模式,然后看看相关的防火墙设置是不是正确。

http://support.microsoft.com/kb/283679
  相关解决方案