一个通过Socks5代理发送UDP数据的类
用法:
CProxySocketSocksV5 MySocket;
MySocket.Create(0,SOCK_DGRAM);
if(0 != MySocket.ConnectToProxyServer ("socks5.proxy.server.ip",socks5serverport))
{
//连接socks5代理服务器失败
return ;
}
//连接成功,你可以像没有socks代理那样使用SendTo,ReceiveFrom收发数据。
。。。
以下是源文件
// ProxySocketSocksV5.h : header file
//
/*
使用Socks5代理协议的socket类,目前只支持UDP协议。
cxiaobao@163.com 24/09/2002
*/
#if !defined(AFX_PROXYSOCKETSOCKSV5_H__07BD21EA_0867_4F91_A82A_72F3AF706228__INCLUDED_)
#define AFX_PROXYSOCKETSOCKSV5_H__07BD21EA_0867_4F91_A82A_72F3AF706228__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//验证方法选择 请求
struct SOCKS5SELECTREQEST
{
BYTE ver; //版本号,必须是5
BYTE nmethods; //认证方法的数量
BYTE methods[255]; //认证方法
/*
· '00' 不需要认证
· '01' GSSAPI
· '02' 用户名/密码
· '03' -- X'7F' 由IANA分配
· '80' -- X'FE' 为私人方法所保留的
· 'FF' 没有可以接受的方法
*/
};
//验证方法选择 回应
struct SOCKS5SELECTANSWER
{
BYTE ver; //版本号,必须是5
BYTE method; //验证方法,是SOCKS5REQUEST1中methods[255]中的一个值
//具体见SOCKS5REQUEST1.methods[255]的说明
};
//验证 请求
struct SOCKS5AUTHENTICATE
{
BYTE ver; //版本号,为1
BYTE ulen; //用户名长度
BYTE user[255]; //用户名
BYTE plen; //密码长度
BYTE pass[255]; //密码
};
//验证 回应
struct SOCKS5AUTHANSWER
{
BYTE ver; //版本号
BYTE state; //验证状态
};
//Socks5命令 请求
struct SOCKS5COMMANDREQUEST
{
BYTE ver; //版本号
BYTE cmd; //命令
/*
CONNECT:'01'
BIND:'02'
UDP ASSOCIATE:'03'
*/
BYTE rsv; //保留,必须为0
BYTE type; //表明其后的地址类型
/*
· IPV4:X'01'
· 域名:X'03'
· IPV6:X'04'
*/
ULONG addr; //目标地址,这里只支持ipv4
/*取决于type
'01': 基于IPV4的IP地址,4个字节长
'03': 基于域名的地址,地址字段中的第一字节是以字节为单位的该域名的长度,没有结尾的NUL字节。
'04': 基于IPV6的IP地址,16个字节长
*/
WORD port; //目标端口(网络字节顺序)
};
//SOCKS5命令 回应
struct SOCK5COMMANDANSWER
{
BYTE ver; //版本号
BYTE rep; //回应消息
/*
· X'00' 成功
· X'01' 普通的SOCKS服务器请求失败
· X'02' 现有的规则不允许的连接
· X'03' 网络不可达
· X'04' 主机不可达
· X'05' 连接被拒
· X'06' TTL超时
· X'07' 不支持的命令
· X'08' 不支持的地址类型
· X'09' - X'FF' 未定义
*/
BYTE rsv; //保留
BYTE type; //同SOCKS5COMMANDREQUEST
ULONG addr; //返回的地址
WORD port; //返回的端口(网络字节顺序)
};
//socks5规定的udp数据包头
struct SOCKS5UDPHEADER
{
WORD rsv; //保留
BYTE frag; //分段标志,如果不分段则为0
BYTE type; //同SOCKS5COMMANDREQUEST
ULONG addr; //目标地址,同SOCKS5COMMANDREQUEST
WORD port; //目标端口,同SOCKS5COMMANDREQUEST
};
/////////////////////////////////////////////////////////////////////////////
// CProxySocketSocksV5 command target
class CProxySocketSocksV5 : public CAsyncSocket
{
SOCKET m_SocketCommand; //与Sock5服务器交互的socket
BOOL m_bConnected;
ULONG m_AddrBinding;
WORD m_PortBinding;
// Attributes
public:
char m_User[255]; //用户名
char m_Pass[255]; //密码
char m_Server[20]; //socks5 server ip
WORD m_Port;
// Operations
public:
CProxySocketSocksV5();
virtual ~CProxySocketSocksV5();
int SendTo(const void* lpBuf, int nBufLen,
UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0);
int SendTo(const void* lpBuf, int nBufLen,
const SOCKADDR* lpSockAddr, int nSockAddrLen, int nFlags = 0);
int ReceiveFrom(void* lpBuf, int nBufLen,
CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0);
int ReceiveFrom(void* lpBuf, int nBufLen,
SOCKADDR* lpSockAddr, int* lpSockAddrLen, int nFlags = 0);
// Overrides
public:
void Close();
UINT ConnectToProxyServer(char* server = NULL,WORD nPort = 0, char* user = NULL, char* pass = NULL);
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CProxySocketSocksV5)
//}}AFX_VIRTUAL
// Generated message map functions
//{{AFX_MSG(CProxySocketSocksV5)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
// Implementation
protected:
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_PROXYSOCKETSOCKSV5_H__07BD21EA_0867_4F91_A82A_72F3AF706228__INCLUDED_)