📄 soc.h
字号:
//////////////////////////////////////////////////////////////////////
//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 + -