用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧Visual C++

CMultiFTP类源代码

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 20:33:28

为了让大家更好的理解我发表的<<实现FTP多线程下载>>,我把我自己编写的CMultiFTP类贴上来。这段代码我不是很满意(以前写的,请写的较仓促),
但主要供大家参考,更好得理解多线程下载的实现。


// MultiFTP1.cpp: implementation of the CMultiFTP class.
//
//////////////////////////////////////////////////////////////////////
/*

#include "stdafx.h"
#include "MultiFTP.h"
#include "MultiFTP1.h"
#include <afxmt.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define BUFFERSIZE 5000
CCriticalSection gcs_multiftp;
struct stThreadParam
{
 CString szLocalname;
 CString szRemotename;
 CString szHost;
 CString szUsername,szPassword;
 int ID;
 int nPort;
 CMultiFTP *pFtp;
 UINT uStart,uLength;
};

UINT DownloadThread(LPVOID pVoid)
{
 stThreadParam *pvar=(stThreadParam *)pVoid;
 int ID=pvar->ID ,nPort=pvar->nPort;
 CString szLocalname=pvar->szLocalname,szRemotename=pvar->szRemotename;
 CString szHost=pvar->szHost ;
 CString szUsername=pvar->szUsername ,szPassword=pvar->szPassword ;
 CMultiFTP *pFtp=pvar->pFtp;
 UINT uStart=pvar->uStart ,uLength=pvar->uLength;
 delete pvar;
 file://init over
 
 CString szMsg;
 CFTPGetFile m_getfile(pFtp);
 CFile m_file;
 char *pBuffer;

 if(!m_getfile.Connect(szHost,nPort,szUsername,szPassword))
 {
  szMsg.Format("connect to data port failID:%dError:%s",ID,m_getfile.szMsg);
  AfxMessageBox(szMsg);
  return 0;
 }
 m_file.Open(szLocalname,CFile::modeWriteCFile::modeCreate);
 pBuffer=(char *)VirtualAlloc(NULL,uLength,MEM_RESERVEMEM_COMMIT,PAGE_READWRITE);
 ASSERT(pBuffer);
 if(!m_getfile.OpenFile(szRemotename,szLocalname,uStart,uLength))
 {
  m_file.Close();
  DeleteFile(szLocalname);
  VirtualFree(pBuffer,0,MEM_RELEASE);
  szMsg.Format("open file failID:%dError:%s",ID,m_getfile.szMsg);
  AfxMessageBox(szMsg);
  return 0;
 }
 file://get file contents
 for(UINT uRead;uLength;uLength-=uRead)
 {
  uRead=m_getfile.Read(pBuffer,uLength);
  m_file.Write(pBuffer,uRead);
 }
 m_file.Close();
 VirtualFree(pBuffer,0,MEM_RELEASE);
 
 gcs_multiftp.Lock();
 pFtp->OnThreadOver(ID,0,"ok");
 gcs_multiftp.Unlock();
 
 return 0;
}


CMultiFTP::CMultiFTP()
{
 skClient.Create();
 nThreads=1;
 blContinue=FALSE;
}

CMultiFTP::~CMultiFTP()
{
 skClient.ShutDown(2);
 skClient.Close();
}

int CMultiFTP::GetThreads()
{
 return nThreads;
}

int CMultiFTP::SetThreads(int n)
{
 if(blContinue)
  nThreads=n;
 return nThreads;
}

BOOL CMultiFTP::Connect(CString szHost, UINT Port, CString szUser, CString szPass)
{
 ASSERT(skClient.m_hSocket);
 szHostname=szHost;
 nPort=Port;
 szUsername=szUser;
 szPassword=szPass;
 
 szMsg=="";
 if(!skClient.Connect(szHostname,nPort))
 {
  return FALSE;
 }
 GetMsg();

 CString szCommand;
 szCommand.Format("user %s",szUsername);
 DoCommand(szCommand);
 szCommand.Format("pass %s",szPassword);
 if(DoCommand(szCommand)!=FTP_LOGOK)
  return FALSE;
 if(szMsg[3]=='-')
  GetMsg();
 if(DoCommand("rest 100")==FTP_RESTOK)
 {
  blContinue=TRUE;
 }
 else
 {
  nThreads=1;
  blContinue=FALSE;
 }
 DoCommand("type a");

 return TRUE;
}

void CMultiFTP::GetMsg()
{
 szMsg="";
 char chMsg[256];
 int nRecv;

    nRecv=skClient.Receive(chMsg,255);
 if(nRecv==SOCKET_ERROR nRecv==0) return;
 chMsg[nRecv]='

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

相关文章

PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:15,328.13000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号