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

📄 soc.h

📁 bofangqi wenjian 文件的播放起 文件的
💻 H
📖 第 1 页 / 共 2 页
字号:

//////////////////////////////////////////////////////////////////////
//author:
//	sproll.gangaro
//////////////////////////////////////////////////////////////////////





// Soc.h: interface for the CSoc class.
//
//////////////////////////////////////////////////////////////////////

#pragma once

#include <Winsock2.h>
#include <afxmt.h>
#include <vector>

class CSocMesWnd;

/////////////////////////////////////////////////////////////////////////////
//
// 向客户窗体发送的消息的wParam
//
/////////////////////////////////////////////////////////////////////////////

enum NET_MSG
{
	NET_TCPSERVERACCEPT		= 1,		//服务socket接收一个客户socket连接请求
										//lParam为SERVE_LPARAM结构的指针,其中,
										//如果Accept失败,m_nSucSoc为-1,
										//如果成功,m_nSucSoc为成功的子socket的ID(正数)
	NET_TCPSERVERCLOSE		= 2,		//服务socket中传递数据的子socket关闭
										//lParam为SERVE_LPARAM结构的指针,其中,
										//m_nSucSoc为子socket的ID
	NET_TCPSERVERRECEIVE	= 3,		//服务socket中传递数据的子socket收到数据
										//lParam为SERVE_LPARAM结构的指针,其中,
										//m_nSucSoc为子socket的ID
	NET_TCPSERVERSEND		= 4,		//服务socket中传递数据的子socket发送数据
										//lParam为SERVE_LPARAM结构的指针,其中,
										//m_nSucSoc为子socket的ID

	NET_TCPCLIENTCONNECTED	= 5,		//客户socket连接成功
										//lParam为附加数据
	NET_TCPCLIENTCLOSE		= 6,		//客户socket关闭
										//lParam为附加数据
	NET_TCPCLIENTRECEIVE	= 7,		//客户socket收到数据
										//lParam为附加数据
	NET_TCPCLIENTSEND		= 8,		//客户socket发送数据
										//lParam为附加数据

	NET_UDPCLOSE			= 9,		//UDP协议的socket关闭
										//lParam为附加数据
	NET_UDPRECEIVE			= 10,		//UDP协议的socket收到数据
										//lParam为保存发送方IP和端口的UDP_LPARAM指针
	NET_UDPSEND				= 11,		//UDP协议的socket发送数据
										//lParam为附加数据

	NET_UDPSOCKS5CLOSE		= 12,		//Socks5 UDP协议的socket关闭
										//lParam为附加数据
	NET_UDPSOCKS5RECEIVE	= 13,		//Socks5 UDP协议的socket收到数据
										//lParam为保存发送方IP和端口的UDP_LPARAM指针
	NET_UDPSOCKS5SEND		= 14,		//Socks5 UDP协议的socket发送数据
										//lParam为附加数据

	NET_FTPLOGIN			= 15,		//登录FTP服务器成功
										//lParam为附加数据
	NET_FTPREPLY			= 16,		//收到服务器的回复信息
										//lParam为FTP_LPARAM指针,m_pRecvData为收到的数据内容,以'\0'结尾
	NET_FTPCOMMAND			= 17,		//向服务器发送命令
										//lParam为FTP_LPARAM指针,m_pRecvData为发送的命令内容,以'\0'结尾
	NET_FTPLIST				= 18,		//收到服务器发送的文件列表
										//lParam为FTP_LPARAM指针,m_pRecvData为文件列表,以'\0'结尾
	NET_FTPDOWNDATA			= 19,		//收到服务器发送的下载文件的某段数据
										//lParam为附加数据
	NET_DOWNEND				= 20		//接收服务器的数据完毕(List、Down命令都会发送该消息)
										//lParam为附加数据
};

//初始化socket服务
int IniAPISocket();

//结束socket服务
void CloseAPISocket();

//枚举本地主机的IP
int EnumLocalIP( BYTE * pucIP, int &nNumber );

struct IPINFO
{
	BYTE pucIP[4];
	int nPort;
};

struct SERVE_LPARAM
{
	int m_nSucSoc;
	void *m_pData;
};

struct UDP_LPARAM
{
	IPINFO m_uInfo;
	void *m_pData;
};

struct FTP_LPARAM
{
	const BYTE *m_pRecvData;
	void *m_pData;
};

//收到网络消息时有两种处理方式:
//1、向指定的窗口发送消息
//2、调用指定的回调函数:SOCKET_NOTIFY
typedef void (*SOCKET_NOTIFY)(WPARAM wParam, LPARAM lParam);

/////////////////////////////////////////////////////////////////////////////
//
// 向自带的消息窗体发送的消息
//
/////////////////////////////////////////////////////////////////////////////
#define SOC_NETSERVE		WM_USER + 1			//CTCPServe的socket消息
#define SOC_NETCLIENT		WM_USER + 2			//CTCPClient的socket消息
#define SOC_NETUDP			WM_USER + 3			//CUDPSocket的socket消息
#define SOC_NETUDPSOCKS5	WM_USER + 4			//CUDPSock5的socket消息

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

	//返回当前服务socket的连接情况,true为连接,false为未连接
	bool GetSocketState();
	//返回当前连接的客户socket数量(即当前打开的子socket数量)
	int GetClientCount();
	//返回当前打开的子socket的ID
	int GetDataSocketID( int nIndex );
	//返回当前连接的socket的远程主机IP和端口
	int GetRemoteIP( int nID, CString& strPeerAddress, int &nPeerPort );
	//返回当前连接的socket的本地主机IP和端口
	int GetLocalIP( int nID, CString& strPeerAddress, int &nPeerPort );
	//返回服务socket监听端口和本地IP
	int GetServerIP(CString &strPeerAddress, int &nPeerPort);
	//设置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 nID, int nLevel, int nName, char *pcNewValue, int *pnValueLen );
	// 设置socket参数
	int SetOption( int nID, int nLevel, int nName, const char *pcNewValue, int nValueLen );
	//打开socket,并开始侦听
	int OpenSocket( int nPort );
	//关闭通讯socket通道
	int CloseDataSocket( int nID );
	//关闭服务socket
	void CloseSocket();
	//获得socket通道中收到的数据
	void GetData( const BYTE ** ppucBuf, int &nLen ){*ppucBuf = m_pucDataBuf; nLen = m_nDataLen;};
	// 在指定的socket通道中发送数据
	int SendData( int nID, const BYTE *pucSendBuf, int &nLen );

protected:
	
	//返回指定的ID的子socket在数组中的序号
	int GetSocIndex( int nID );

protected:

	//收到socket消息后,向外部发送的附加数据
	void *m_pData;

	bool m_pbOpenSev;
	SOCKET m_socServer;

	//数据socket

	//数据socket的打开状态
	std::vector<bool> m_pbSocOpen;
	//数据socket的ID
	std::vector<int> m_pnSocID;
	//数据socket的句柄
	std::vector<SOCKET> m_pSocData;

	//下一个可用的socket的ID
	int m_nNextID;

	//缓冲区
	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 CTCPClient
{
public:
	CTCPClient();
	~CTCPClient();
	
public:

	//返回当前socket的连接情况,true为连接,false为未连接
	bool GetSocketState();
	//返回当前连接的socket的远程主机IP和端口
	int GetRemoteIP( CString& strPeerAddress, int &nPeerPort );
	//返回当前连接的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,并链接到远程主机
	int OpenSocket( BYTE *pucIP, int nRemotePort, int nLocalPort );
	//关闭socket
	void CloseSocket();
	//获得收到的数据
	void GetData( const BYTE ** ppucBuf, int &nLen ){*ppucBuf = m_pucDataBuf; nLen = m_nDataLen;};
	//发送数据
	int SendData( const BYTE *pucSendBuf, int &nLen );

protected:

	void *m_pData;

	bool m_bClientOpen;
	SOCKET m_socClient;

	//缓冲区
	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 CUDPSocket
{
public:

	CUDPSocket();
	~CUDPSocket();

public:

	/////////////////////////////////////////////////////////////////////////////
	//
	// 组播时需要注意:
	//
	// 组播IP地址范围:[224.0.0.0, 239,255,255,255]
	// 224.0.0.0		保留
	// 224.0.0.1		代表子网内所有主机
	// 224.0.0.2		代表子网内所有路由器
	// 224.0.1.1		网络时间协议
	// 224.0.0.9		RIP第2版本组地址
	// 224.0.1.24	WINS服务器组地址
	// [224.0.0.0, 224.0.0.255]之间的多播组IP,多播路由器不会对多播数据进行转发
	//

⌨️ 快捷键说明

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