⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitspider.h

📁 visual c++ 实例编程
💻 H
字号:
#if !defined(AFX_BITSPIDER_H__E34DC91B_7FDE_48AB_8077_2F9B8197CA04__INCLUDED_)
#define AFX_BITSPIDER_H__E34DC91B_7FDE_48AB_8077_2F9B8197CA04__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// BitSpider.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// BitSpider window
#include <deque>
#include <math.h>
#include <fstream.h>
#include "SSP.h"

//处理监听的函数的指针
#define LISTENFUNC(varN)	bool (*varN)(_SENDTHREADPARAM *phParam,SSP::_SSPPACKET& packet)


class AFX_EXT_CLASS BitSpider : public CWnd
{
// Construction
public:
	struct AFX_EXT_CLASS _SENDTHREADPARAM
	{
		SOCKET			sock;
		HWND			hwnd;
		CWinThread*		pThread;
		WORD			wPort;
		bool			bInternet;
		bool			bRun;
		LISTENFUNC(pFunc);			//监听线程处理函数
		_SENDTHREADPARAM():pFunc(NULL),bRun(true){};
	};

	struct AFX_EXT_CLASS _FILEDETAIL
	{
		CString		strPathname;	//文件包含路径的名字
		CString		strFilename;	//文件不包含路径的名字
		DWORD		dwFilesize;		//文件的大小字节数
		int			nFileID;		//文件的ID,可以是任意值,标识一个唯一的文件
		bool		bRun;			//是否继续接收或传送的布尔变量
		HWND		hwnd;			//接收消息的窗体的句柄
	};

	enum
	{
		//窗体的字模的高度、窗体的高度和按钮的宽度高度
		WND_FONT_HEIGHT		=11,
		WND_BTN_WIDTH		=12,
		WND_HEIGHT			=WND_FONT_HEIGHT*4+4,

		FILE_SECT_SIZE		=0xFFF,			//每次传送的段的最大尺寸

		
		//dwErrorCode的错误代码
		ERR_FILE_EXIST		=5000,			//文件已经存在
		ERR_FILE_OUTFAILED,					//文件无法写
		ERR_FILE_INFAILED,					//文件无法读
		ERR_RECVING,						//当前BitSpider正在下载
		ERR_WNDNOTCREATE,					//窗体没有创建
		ERR_MORETHANTHREADNO,				//无法创建更多的线程
		ERR_HASTHREADSLEEP,					//有线程处于休眠状态


		//SSPFile类在传送或接收过程中发出的消息
		MSG_GETFILENAME		=12356,
			//wParam	--	_FILEDETAIL结构的指针
			//返回时,重新设置包含路径的文件名;如果文件名设置为空,则表示没有文件

		MSG_SENDSECT,
		MSG_RECVSECT,
			//wParam	--	_FILEDETAIL结构的指针
			//lParam	--	当前段的长度
		MSG_SENDCOMPLETE,
			//wParam	--	_FILEDETAIL结构的指针
			//lParam	--	完成的原因,调用SSPFile::GetCompleteInfo(lParam,..)传递该参数,可以得到具体原因的字符串表示
			//				如果函数返回true,则表示成功,false表示失败。
		MSG_SETFILENAMESIZE,
			//wParam	--	_FILEDETAIL结构的指针
	};

	BitSpider();
	virtual ~BitSpider();

	BOOL	IsUDP(){return m_bUDP;};
	BOOL	AddIP(const char *lpSrvIP,WORD wPort,WORD nPriority=0);
	void	RemoveIP(const char *lpSrvIP);
	BOOL	Create(int offx,int offy,int width, CWnd *pParentWnd);
	BOOL	RunSpider(const char* lpFilename,const char* lpPathname,HWND hWnd,BYTE byThreadCount,int nFileID=0,bool bUDP=false);

	static int	GetScreenWidth();
	static bool GetCompleteInfo(int which,CString& str);
	static UINT TCPListenThread(LPVOID lpData);
	static UINT UDPListenThread(LPVOID lpData);

	DWORD			m_dwErrorCode;				//错误代码
	bool			m_bExistQuery;				//文件存在时询问
	bool			m_bCrc;						//是否要进行校验
	bool			m_bInternet;				//是否是Internet应用

	static	BitSpider*	pCurrRecvWnd;			//当前的作用的窗口
	static	BitSpider*	pCurrSendWnd;			//传送文件的窗口

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(BitSpider)
	//}}AFX_VIRTUAL

	// Generated message map functions
protected:
	HWND			m_hMsgWnd;
	BYTE			m_byRunThreadCount;
	BYTE			m_bySleepThreadCount;
	CString			m_strFilename;
	CString			m_strPathname;
	ofstream		m_ofs;
	ifstream		m_ifs;
	CFont			m_font;

	CStatic			m_staFilesize;
	CStatic			m_staFilename;
	CStatic			m_staCurrLen;
	CStatic			m_staPrompt;
	CProgressCtrl	m_progress;
	CButton			m_btnAbort;

	void	ReviseContent(CRect& rect);
	LRESULT OnSendComplete(WPARAM wParam, LPARAM lParam);
	LRESULT OnUpdateSect(WPARAM wParam, LPARAM lParam);
	LRESULT OnSetFilenameSize(WPARAM wParam, LPARAM lParam);
	LRESULT OnAssignNewSect(WPARAM wParam, LPARAM lParam);
	LRESULT OnAbort(WPARAM wParam, LPARAM lParam);
	LRESULT OnCreateRecvThread(WPARAM wParam, LPARAM lParam);

	//{{AFX_MSG(BitSpider)
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
private:
	struct _SECTFILEHEADER;
	struct _SRVIP;
	bool	m_bWaitIP;
	bool	m_bUDP;
	BYTE	m_byThreadCount;

	std::deque<_SRVIP*>			m_dqSrvIP;
	_FILEDETAIL*				m_phThreadDetail[10];
	_SECTFILEHEADER*			m_pSectHeader;

	inline void		ResetCurrWnd();
	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);
	static UINT ConnectedUDPThread(LPVOID lpData);
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_BITSPIDER_H__E34DC91B_7FDE_48AB_8077_2F9B8197CA04__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -