www.pudn.com > DSPSample.rar > DSPSpider.h
// DSPSpider.h: interface for the DSPSpider class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_DSPSPIDER_H__563AE7C8_78D7_45C0_BA2E_2596100F6D64__INCLUDED_) #define AFX_DSPSPIDER_H__563AE7C8_78D7_45C0_BA2E_2596100F6D64__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include#include #include #include "DSP.h" #define LISTENPORT 34567 //处理监听的函数的指针 #define LISTENFUNC(varN) bool (*varN)(_SENDTHREADPARAM *phParam,DSP::_DSPPACKET& packet) class AFX_EXT_CLASS DSPSpider { public: DSPSpider(); virtual ~DSPSpider(); struct AFX_EXT_CLASS _SENDTHREADPARAM { SOCKET sock; HWND hwnd; CWnd* pCWnd; bool bInternet; LISTENFUNC(pFunc); //监听线程处理函数 _SENDTHREADPARAM():pFunc(NULL){}; }; struct AFX_EXT_CLASS _FILEDETAIL { CString strPathname; //文件包含路径的名字 CString strFilename; //文件不包含路径的名字 DWORD dwFilesize; //文件的大小字节数 int nFileID; //文件的ID,可以是任意值,标识一个唯一的文件 bool bRun; //是否继续接收或传送的布尔变量 HWND hwnd; //接收消息的窗体的句柄 }; enum { FILE_SECT_SIZE =0xFFF, //每次传送的段的最大尺寸 //dwErrorCode的错误代码 ERR_FILE_EXIST =5000, //文件已经存在 ERR_FILE_OUTFAILED, //文件无法写 ERR_FILE_INFAILED, //文件无法读 ERR_RECVING, //当前BitSpider正在下载 ERR_WNDNOTCREATE, //窗体没有创建 ERR_MORETHANTHREADNO, //无法创建更多的线程 ERR_HASTHREADSLEEP, //有线程处于休眠状态 //提示信息的种类 PROMPT_RECVSLEEP =10000, PROMPT_MORETHAN, PROMPT_NOIP, PROMPT_CONNECTNEWIP, PROMPT_CANNOTCONNECT, PROMPT_RECVABORT, PROMPT_RECVEND, //DSPFile类在传送或接收过程中发出的消息 MSG_GETFILENAME =12356, //wParam -- _FILEDETAIL结构的指针 //返回时,重新设置包含路径的文件名;如果文件名设置为空,则表示没有文件 MSG_SENDSECT, MSG_RECVSECT, //wParam -- _FILEDETAIL结构的指针 //lParam -- 当前段的长度 MSG_SENDCOMPLETE, //wParam -- _FILEDETAIL结构的指针 //lParam -- 完成的原因,调用DSPFile::GetCompleteInfo(lParam,..)传递该参数,可以得到具体原因的字符串表示 // 如果函数返回true,则表示成功,false表示失败。 MSG_SETFILENAMESIZE, //wParam -- _FILEDETAIL结构的指针 MSG_SHOWPROMPT, //wParam -- 提示信息的种类 }; void SafeRelease(); BOOL AddIP(const char *lpSrvIP,WORD wPort,WORD nPriority=0); void RemoveIP(const char *lpSrvIP); BOOL RunSpider(const char* lpFilename,const char* lpPathname,HWND hWnd,BYTE byThreadCount,int nFileID=0); DWORD GetProgressStep(); DWORD GetCurrSize(); LRESULT OnSendComplete(WPARAM wParam, LPARAM lParam); LRESULT OnUpdateSect(WPARAM wParam, LPARAM lParam); LRESULT OnAssignNewSect(WPARAM wParam, LPARAM lParam); LRESULT OnAbort(WPARAM wParam, LPARAM lParam); LRESULT OnCreateRecvThread(WPARAM wParam, LPARAM lParam); static void SetFilename(WPARAM wParam,CString& strPathname); static bool GetCompleteInfo(int which,CString& str); static UINT ListenThread(LPVOID lpData); DWORD m_dwErrorCode; //错误代码 bool m_bExistQuery; //文件存在时询问 bool m_bCrc; //是否要进行校验 bool m_bInternet; //是否是Internet应用 protected: HWND m_hMsgWnd; BYTE m_byRunThreadCount; BYTE m_bySleepThreadCount; CString m_strFilename; CString m_strPathname; ofstream m_ofs; ifstream m_ifs; private: struct _SECTFILEHEADER; struct _SRVIP; struct _MINSECT; bool m_bWaitIP; BYTE m_byThreadCount; std::deque<_SRVIP*> m_dqSrvIP; _FILEDETAIL* m_phThreadDetail[10]; _SECTFILEHEADER* m_pSectHeader; inline void ReleaseIP(int nSrvIPNo); inline int GetSrvIP(); inline void ShowPromptMessage(WORD which,const char* lpIP=NULL); inline BOOL InitRecvSpider(BYTE byThreadCount,int nFileID); inline BOOL RunAnRecvThread(); static UINT ConnectedSocketThread(LPVOID lpData); }; #endif // !defined(AFX_DSPSPIDER_H__563AE7C8_78D7_45C0_BA2E_2596100F6D64__INCLUDED_)