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

📄 soc.h

📁 socket代理的C++源码,实现了代理服务器的大部分功能
💻 H
📖 第 1 页 / 共 2 页
字号:
	// 对于多网卡的多播终端,可以通过IP_MULTICAST_IF参数设置进行多播的IP
	//
	// CUDPSocket类中多播返还固定为false
	//
	/////////////////////////////////////////////////////////////////////////////



	//返回当前socket的连接情况,true为连接,false为未连接
	bool GetSocketState();
	//返回当前连接的socket的远程主机IP和端口(非组播传输)
	int GetLocalIP( CString& strPeerAddress, int &nPeerPort );
	//设置向CSocMesWnd发送的socket的消息通知窗体和消息
	void SetSocketNotify( HWND hWndMsg, UINT unMsg ){m_hWndMsg = hWndMsg; m_nMsg = unMsg;};
	void SetSocketNotify(SOCKET_NOTIFY pFuncMes){m_pFuncMes = pFuncMes;};
	//设置接收数据的缓冲区大小
	void SetBufferLen( int nLen );
	//设置收到socket消息后,向外部发送的附加数据
	void SetExtData(void *pData){m_pData = pData;};
	//获取socket参数
	int GetOption( int nLevel, int nName, char *pcNewValue, int *pnValueLen );
	//设置socket参数
	int SetOption( int nLevel, int nName, const char *pcNewValue, int nValueLen );
	//打开socket,如果pucGroupIP不为空,则Socket方式为组播
	int OpenSocket( int nLocalPort, BYTE *pucGroupIP = NULL, bool bRoot = false );
	//关闭socket
	void CloseSocket();
	//获得收到的数据
	void GetData( const BYTE ** ppucBuf, int &nLen ){*ppucBuf = m_pucDataBuf; nLen = m_nDataLen;};
	//发送数据
	int SendData( BYTE *pucIP, int nDesPort, const BYTE *pucSendBuf, int &nLen );
	//向加入组的终端发送数据
	int SendData( const BYTE *pucSendBuf, int &nLen );

protected:
	
	void *m_pData;

	bool m_bUDPOpen;
	SOCKET m_socUDP;

	//是否组播方式打开
	bool m_bGroup;
	//组播socket是否打开
	bool m_bGSocOpen;
	//组播Socket
	SOCKET m_socGroup;
	//组播的组IP
	BYTE m_pucGroupIP[4];
	//组播的端口
	int m_nGroupPort;

	//缓冲区
	BYTE *m_pucDataBuf;
	//收发的数据的大小
	int m_nDataLen;
	//当前申请的缓冲区大小
	int m_nBufLen;

	//发送网络消息的窗体
	CSocMesWnd * m_pdlgMes;

	//socket事件发送的目的窗体
	HWND m_hWndMsg;
	//发送的消息
	UINT m_nMsg;
	//网络消息回调函数
	SOCKET_NOTIFY m_pFuncMes;
	
	friend class CSocMesWnd;
};

class CUDPSock5
{
public:
	CUDPSock5();
	~CUDPSock5();
	
public:

	//返回当前socket的连接情况,true为连接,false为未连接
	bool GetSocketState();
	//返回代理分配给客户端的端口
	int GetProxyAlloPort();
	//设置向CSocMesWnd发送的socket的消息通知窗体和消息
	void SetSocketNotify( HWND hWndMsg, UINT unMsg ){m_hWndMsg = hWndMsg; m_nMsg = unMsg;};
	void SetSocketNotify(SOCKET_NOTIFY pFuncMes){m_pFuncMes = pFuncMes;};
	//设置接收数据的缓冲区大小
	void SetBufferLen( int nLen );
	//设置收到socket消息后,向外部发送的附加数据
	void SetExtData(void *pData){m_pData = pData;};
	//获取socket参数
	int GetOption( int nLevel, int nName, char *pcNewValue, int *pnValueLen );
	//设置socket参数
	int SetOption( int nLevel, int nName, const char *pcNewValue, int nValueLen );
	//打开socket,并链接到远程主机
	int OpenSocket( BYTE *pucProxyInterIP, int nProxyPort, int nLocalPort,
		BYTE *pucProxyOuterIP = NULL, CString strUser = "", CString strPass = "" );
	//关闭socket
	void CloseSocket();
	//获得收到的数据
	void GetData( const BYTE ** ppucBuf, int &nLen ){*ppucBuf = m_pucDataBuf; nLen = m_nDataLen;};
	//发送数据
	int SendData( BYTE *pucDesIP, int nDesPort, const BYTE *pucSendBuf, int &nLen );

protected:
	
	void *m_pData;

	bool m_bOpen;
	SOCKET m_socTCPToProxy;
	SOCKET m_socUDPData;

	//代理主机的IP
	BYTE m_pucProxyIP[4];
	//代理为主机分配的转发端口
	int nPorxyAlloPort;

	//缓冲区
	BYTE *m_pucDataBuf;
	//收发的数据的大小
	int m_nDataLen;
	//当前申请的缓冲区大小
	int m_nBufLen;

	//发送网络消息的窗体
	CSocMesWnd * m_pdlgMes;

	//socket事件发送的目的窗体
	HWND m_hWndMsg;
	//发送的消息
	UINT m_nMsg;
	//网络消息回调函数
	SOCKET_NOTIFY m_pFuncMes;
	
	friend class CSocMesWnd;
};

class CFtp
{
public:

	enum FTP_MODE
	{
		AUTO = 1,
		PORT,				//FTP下载方式:port
		PASSIVE				//FTP下载方式:passive
	};

	CFtp();
	~CFtp();

	//设置FTP的消息通知窗体和消息
	void SetSocketNotify( HWND hWndMsg, UINT unMsg ){m_hWndMsg = hWndMsg; m_nMsg = unMsg;};
	void SetSocketNotify(SOCKET_NOTIFY pFuncMes){m_pFuncMes = pFuncMes;};
	//设置收到socket消息后,向外部发送的附加数据
	void SetExtData(void *pData){m_pData = pData;};
	//设置工作FTP模式:
	void SetMode(FTP_MODE eMode){m_eMode = eMode;};

	//获取FTP服务器上的文件大小(开始下载之后才有效)
	unsigned int GetFileSize(){return m_unFileSize;};
	//获取当前下载的数据大小
	unsigned int GetDownSize(){return m_unDownSize;};

	//连接远程FTP服务器
	int Connect(BYTE *pucServerIP, int nServerPort,
		CString strUser = "", CString strPass = "");
	//关闭FTP连接
	void Close();

	//获取远程目录下的文件列表
	int List();

	//获取当前的远程目录
	int Pwd();

	//进入上一级目录
	int CDFather();

	//进入子目录
	int CDSub(CString strDir);

	//下载文件
	int DownLoad(CString strFile, CString strSave = "", unsigned int unStart = 0);

	//删除文件
	int Delete(CString strFile);

	//创建目录
	int MakeDir(CString strDir);

	//获取服务器的帮助信息,如:支持的命令的列表
	int Help(CString strParam = "");

	//获取当前收到的文件数据(当收到NET_FTPDOWNDATA消息时调用)
	void GetData( const BYTE **pucBuf, int &nLen );

	CEvent m_evtLogin;

protected:

	//处理服务器返回的信息的函数
	static void DisposeReplay(WPARAM wParam, LPARAM lParam);
	//处理服务器返回的数据的函数
	static void DisposeData(WPARAM wParam, LPARAM lParam);

	//回复远程服务器的命令
	void ReplayFtpServer();
	//向远程服务器发送命令
	int SendCommand(BYTE *pucSendData, int nLen);

	//处理一条回复
	void ReplayOneCommand(CString strCmd);
	//打开数据TCP端口,准备发送FTP命令
	int OpenDataPort();

	//接收服务器发送的数据
	void ReadServerData(bool bMode);

	//发送下载命令,开始下载文件
	void StartDownLoad();

	//将收到的数据写入文件
	int WriteData(const BYTE *pData, int nLen);

protected:
	
	void *m_pData;

	//FTP工作模式
	FTP_MODE m_eMode;

	//socket事件发送的目的窗体
	HWND m_hWndMsg;
	//发送的消息
	UINT m_nMsg;
	//网络消息回调函数
	SOCKET_NOTIFY m_pFuncMes;
	
	//FTP服务器的IP和端口
	BYTE m_pucFtpServerIP[4];
	int m_nFtpServerPort;

	//登录FTP的用户名和密码
	CString m_strUser;
	CString m_strPass;

	//开始下载的文件位置
	unsigned int m_unStartPos;

	//下载远程文件时,是否同时将数据写入文件
	bool m_bWrite;

	//从服务器得到的FTP模式,true,PORT,false,PASSIV
	bool m_bMode;

	//当前FTP进度标志
	//关闭(true则处于未连接FTP服务器状态)
	bool m_bClose;
	//成功连接远程服务器(true则处于已连接FTP服务器,未登录状态)
	bool m_bConnect;
	//用户名传输确认(true则FTP服务器已确认用户名)
	bool m_bUser;
	//密码认证确认(true则FTP服务器已确认密码,登录完成)
	bool m_bPass;
	//处于请求LIST状态
	bool m_bList;
	//处于请求DOWNLOAD状态
	bool m_bDownload;
	//处于正在传送数据的状态,此时m_psocDataSrv或者m_psocDataClt已经打开,此期间不向服务器发送任何FTP命令
	bool m_bData;
	//收到文件大小后是否启动线程下载文件(signal则开始下载文件前获取文件大小完成)
	bool m_bDownFileSize;
	//PASSIVE模式下等待服务器端口号回复
	bool m_bWaitForPort;

	//DATA_PORT模式时,供FTP服务器连接,传输数据的TCP(缓冲区大小0xFFFF)
	CTCPServe *m_psocDataSrv;
	//PASSIVE模式时,连接FTP服务器,传输数据的TCP
	CTCPClient *m_psocDataClt;
	//与FTP服务器交互命令的TCP(缓冲区大小1024)
	CTCPClient *m_psocCommand;

	//下载的文件名称
	CString m_strFileDown;
	//下载文件保存在本地名称
	CString m_strFileSave;

	//下载的文件大小
	unsigned int m_unFileSize;
	//当前总共下载的数据大小
	unsigned int m_unDownSize;

	//下载的文件
	CFile *m_pfilDown;
	//保存收到的数据大小的缓冲区
	BYTE *m_pDataBuf;
};

⌨️ 快捷键说明

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