Implement SOCKS proxy feature
This commit is contained in:
@@ -4,6 +4,9 @@
|
||||
#pragma comment(lib,"ws2_32.lib")
|
||||
#include "CpuUseage.h"
|
||||
#include "Buffer.h"
|
||||
#define XXH_INLINE_ALL
|
||||
#include "xxhash.h"
|
||||
|
||||
#if USING_CTX
|
||||
#include "zstd/zstd.h"
|
||||
#endif
|
||||
@@ -20,6 +23,25 @@
|
||||
|
||||
std::string GetRemoteIP(SOCKET sock);
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
ONLINELIST_IP = 0, // IP<49><50><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>
|
||||
ONLINELIST_ADDR, // <20><>ַ
|
||||
ONLINELIST_LOCATION, // <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
||||
ONLINELIST_COMPUTER_NAME, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><>ע
|
||||
ONLINELIST_OS, // <20><><EFBFBD><EFBFBD>ϵͳ
|
||||
ONLINELIST_CPU, // CPU
|
||||
ONLINELIST_VIDEO, // <20><><EFBFBD><EFBFBD>ͷ(<28><><EFBFBD><EFBFBD>)
|
||||
ONLINELIST_PING, // PING(<28>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
ONLINELIST_VERSION, // <20>汾<EFBFBD><E6B1BE>Ϣ
|
||||
ONLINELIST_INSTALLTIME, // <20><>װʱ<D7B0><CAB1>
|
||||
ONLINELIST_LOGINTIME, // <20><EFBFBD><EEB6AF><EFBFBD><EFBFBD>
|
||||
ONLINELIST_CLIENTTYPE, // <20>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ONLINELIST_PATH, // <20>ļ<EFBFBD>·<EFBFBD><C2B7>
|
||||
ONLINELIST_MAX,
|
||||
};
|
||||
|
||||
// Encoder interface. The default encoder will do nothing.
|
||||
class Encoder {
|
||||
public:
|
||||
@@ -172,7 +194,7 @@ enum IOType
|
||||
|
||||
typedef struct CONTEXT_OBJECT
|
||||
{
|
||||
CString sClientInfo[10];
|
||||
CString sClientInfo[ONLINELIST_MAX];
|
||||
SOCKET sClientSocket;
|
||||
WSABUF wsaInBuf;
|
||||
WSABUF wsaOutBuffer;
|
||||
@@ -185,23 +207,30 @@ typedef struct CONTEXT_OBJECT
|
||||
void *olps; // OVERLAPPEDPLUS
|
||||
int CompressMethod; // ѹ<><D1B9><EFBFBD>㷨
|
||||
HeaderParser Parser; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
|
||||
uint64_t ID; // Ψһ<CEA8><D2BB>ʶ
|
||||
|
||||
BOOL m_bProxyConnected; // <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
||||
BOOL bLogin; // <20>Ƿ<EFBFBD> login
|
||||
|
||||
VOID InitMember()
|
||||
{
|
||||
memset(szBuffer,0,sizeof(char)*PACKET_LENGTH);
|
||||
memset(szBuffer, 0, sizeof(char) * PACKET_LENGTH);
|
||||
v1 = 0;
|
||||
hDlg = NULL;
|
||||
sClientSocket = INVALID_SOCKET;
|
||||
memset(&wsaInBuf,0,sizeof(WSABUF));
|
||||
memset(&wsaOutBuffer,0,sizeof(WSABUF));
|
||||
memset(&wsaInBuf, 0, sizeof(WSABUF));
|
||||
memset(&wsaOutBuffer, 0, sizeof(WSABUF));
|
||||
olps = NULL;
|
||||
for (int i = 0; i < ONLINELIST_MAX; i++) {
|
||||
sClientInfo[i].Empty();
|
||||
}
|
||||
CompressMethod = COMPRESS_ZSTD;
|
||||
Parser.Reset();
|
||||
bLogin = FALSE;
|
||||
m_bProxyConnected = FALSE;
|
||||
}
|
||||
VOID SetClientInfo(CString s[10]){
|
||||
for (int i=0; i<sizeof(sClientInfo)/sizeof(CString);i++)
|
||||
VOID SetClientInfo(const CString(&s)[ONLINELIST_MAX]){
|
||||
for (int i = 0; i < ONLINELIST_MAX; i++)
|
||||
{
|
||||
sClientInfo[i] = s[i];
|
||||
}
|
||||
@@ -252,6 +281,17 @@ typedef struct CONTEXT_OBJECT
|
||||
int s = getpeername(sClientSocket, (SOCKADDR*)&ClientAddr, &ulClientAddrLen);
|
||||
return s != INVALID_SOCKET ? inet_ntoa(ClientAddr.sin_addr) : "";
|
||||
}
|
||||
static uint64_t CalculateID(const CString(&data)[ONLINELIST_MAX]) {
|
||||
int idx[] = { ONLINELIST_IP, ONLINELIST_COMPUTER_NAME, ONLINELIST_OS, ONLINELIST_CPU, ONLINELIST_PATH, };
|
||||
CString s;
|
||||
for (int i = 0; i < 5; i++) {
|
||||
s += data[idx[i]] + "|";
|
||||
}
|
||||
s.Delete(s.GetLength() - 1);
|
||||
return XXH64(s.GetString(), s.GetLength(), 0);
|
||||
}
|
||||
uint64_t GetID() const { return ID; }
|
||||
void SetID(uint64_t id) { ID = id; }
|
||||
}CONTEXT_OBJECT,*PCONTEXT_OBJECT;
|
||||
|
||||
typedef CList<PCONTEXT_OBJECT> ContextObjectList;
|
||||
@@ -326,36 +366,52 @@ public:
|
||||
IOCPServer(void);
|
||||
~IOCPServer(void);
|
||||
void Destroy();
|
||||
|
||||
void Disconnect(CONTEXT_OBJECT *ctx){}
|
||||
pfnNotifyProc m_NotifyProc;
|
||||
pfnOfflineProc m_OfflineProc;
|
||||
};
|
||||
|
||||
typedef IOCPServer ISocketBase;
|
||||
|
||||
class CLock
|
||||
{
|
||||
public:
|
||||
CLock(CRITICAL_SECTION& cs)
|
||||
CLock(CRITICAL_SECTION& cs) : m_cs(&cs)
|
||||
{
|
||||
m_cs = &cs;
|
||||
Lock();
|
||||
}
|
||||
CLock() : m_cs(nullptr)
|
||||
{
|
||||
InitializeCriticalSection(&i_cs);
|
||||
}
|
||||
~CLock()
|
||||
{
|
||||
Unlock();
|
||||
m_cs ? Unlock() : DeleteCriticalSection(&i_cs);
|
||||
}
|
||||
|
||||
void Unlock()
|
||||
{
|
||||
LeaveCriticalSection(m_cs);
|
||||
LeaveCriticalSection(m_cs ? m_cs : &i_cs);
|
||||
}
|
||||
|
||||
void Lock()
|
||||
{
|
||||
EnterCriticalSection(m_cs);
|
||||
EnterCriticalSection(m_cs ? m_cs : &i_cs);
|
||||
}
|
||||
|
||||
void unlock()
|
||||
{
|
||||
LeaveCriticalSection(m_cs ? m_cs : &i_cs);
|
||||
}
|
||||
|
||||
void lock()
|
||||
{
|
||||
EnterCriticalSection(m_cs ? m_cs : &i_cs);
|
||||
}
|
||||
|
||||
protected:
|
||||
CRITICAL_SECTION* m_cs;
|
||||
CRITICAL_SECTION* m_cs; // <20>ⲿ<EFBFBD><E2B2BF>
|
||||
CRITICAL_SECTION i_cs; // <20>ڲ<EFBFBD><DAB2><EFBFBD>
|
||||
};
|
||||
|
||||
#define TRACK_OVERLAPPEDPLUS 0
|
||||
|
||||
Reference in New Issue
Block a user