From 64bebb1b86e831134b65d2d242974e278e003f40 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Thu, 3 Jul 2025 04:30:25 +0800 Subject: [PATCH] feature: Add client protocol option TCP/UDP --- client/ClientDll.cpp | 2 +- server/2015Remote/2015Remote.rc | Bin 85754 -> 86054 bytes server/2015Remote/2015RemoteDlg.cpp | 29 +++++++++++++---------- server/2015Remote/2015RemoteDlg.h | 4 ++-- server/2015Remote/BuildDlg.cpp | 6 +++++ server/2015Remote/BuildDlg.h | 1 + server/2015Remote/IOCPServer.cpp | 16 +++++++++---- server/2015Remote/IOCPServer.h | 6 +++-- server/2015Remote/IOCPUDPServer.cpp | 31 +++++++++++------------- server/2015Remote/IOCPUDPServer.h | 29 +++++++++++++++++------ server/2015Remote/Server.h | 35 +++++++++++++++++++++++----- server/2015Remote/resource.h | Bin 41158 -> 42202 bytes 12 files changed, 107 insertions(+), 52 deletions(-) diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index e33e47b..2aa6e17 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -13,7 +13,7 @@ // 远程地址 CONNECT_ADDRESS g_SETTINGS = { FLAG_GHOST, "127.0.0.1", "6543", CLIENT_TYPE_DLL, false, DLL_VERSION, - FALSE, Startup_DLL, NULL, PROTO_TCP, RUNNING_RANDOM, + FALSE, Startup_DLL, NULL, PROTO_UDP, RUNNING_RANDOM, }; // 最终客户端只有2个全局变量: g_SETTINGS、g_MyApp,而g_SETTINGS作为g_MyApp的成员. diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index 80e59695e49176d16b6aa0698b5a3da2b38a5e54..23c6012cfab3e3c384126b414eda9e15a078521c 100644 GIT binary patch delta 162 zcmex0mvz|!)(x{Fm@ODgCeMvXWi*{^m@Pe7E;4}Ag29MEhXF`V-q>U~d4rqM=2MYI zOpIom|3+ssGMfR#<)g(XZ_qWFye(D&$TygLF}8HFK(7{yfAG5Q$saUjCMU#lF&e;> yDF-kFG59lt0I?3xXk!L5AZ-k^0Bi}6GyxhBsF^ukMvswi@&{+J%~^31J^%nF2rqvC delta 103 zcmV-t0GR)#pauG!1+bb}12+IRlbu*)0Wg!#p&OGPSx^Tz05Sk9063E&izk!tn=Y4- zNC5=1&RH%30W`DyTWbLWGypl1A6plbuq`x`wp|zlGypY|(Oq?y{3-zwmvA=$5|d8J J3bUYJhVWNoB-H=_ diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 368595e..87f625b 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -1241,8 +1241,10 @@ void CMy2015RemoteDlg::OnOnlineDelete() { POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); int iItem = m_CList_Online.GetNextSelectedItem(Pos); - CString strIP = m_CList_Online.GetItemText(iItem,ONLINELIST_IP); + CString strIP = m_CList_Online.GetItemText(iItem,ONLINELIST_IP); + context* ctx = (context*)m_CList_Online.GetItemData(iItem); m_CList_Online.DeleteItem(iItem); + ctx->Destroy(); strIP+="鏂紑杩炴帴"; ShowMessage("鎿嶄綔鎴愬姛",strIP); } @@ -1631,11 +1633,10 @@ BOOL CMy2015RemoteDlg::Activate(const std::string& nPort,int nMaxConnection) } -VOID CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject) +BOOL CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject) { if (!g_2015RemoteDlg || g_2015RemoteDlg->isClosed) { - ContextObject->Destroy(); - return; + return FALSE; } AUTO_TICK(50); @@ -1649,16 +1650,17 @@ VOID CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject) HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (hEvent == NULL) { Mprintf("===> NotifyProc CreateEvent FAILED: %p <===\n", ContextObject); - return; + return FALSE; } if (!g_2015RemoteDlg->PostMessage(WM_HANDLEMESSAGE, (WPARAM)hEvent, (LPARAM)ContextObject)) { Mprintf("===> NotifyProc PostMessage FAILED: %p <===\n", ContextObject); CloseHandle(hEvent); - return; + return FALSE; } HANDLE handles[2] = { hEvent, g_2015RemoteDlg->m_hExit }; DWORD result = WaitForMultipleObjects(2, handles, FALSE, INFINITE); } + return TRUE; } // 瀵硅瘽妗嗘寚閽堝強瀵硅瘽妗嗗彞鏌 @@ -1669,10 +1671,10 @@ struct dlgInfo dlgInfo(HANDLE h, HWND type) : hDlg(h), hWnd(type) { } }; -VOID CALLBACK CMy2015RemoteDlg::OfflineProc(CONTEXT_OBJECT* ContextObject) +BOOL CALLBACK CMy2015RemoteDlg::OfflineProc(CONTEXT_OBJECT* ContextObject) { - if (!g_2015RemoteDlg) - return; + if (!g_2015RemoteDlg || g_2015RemoteDlg->isClosed) + return FALSE; dlgInfo* dlg = ContextObject->hWnd ? new dlgInfo(ContextObject->hDlg, ContextObject->hWnd) : NULL; SOCKET nSocket = ContextObject->sClientSocket; @@ -1680,6 +1682,8 @@ VOID CALLBACK CMy2015RemoteDlg::OfflineProc(CONTEXT_OBJECT* ContextObject) g_2015RemoteDlg->PostMessage(WM_USEROFFLINEMSG, (WPARAM)dlg, (LPARAM)nSocket); ContextObject->hWnd = NULL; + + return TRUE; } @@ -2629,9 +2633,10 @@ void CMy2015RemoteDlg::OnListClick(NMHDR* pNMHDR, LRESULT* pResult) CString strText; std::string expired = res[RES_EXPIRED_DATE]; expired = expired.empty() ? "" : " Expired on " + expired; - strText.Format(_T("鏂囦欢璺緞: %s%s\r\n绯荤粺淇℃伅: %s 浣 %s 鏍稿績 %s GB\r\n鍚姩淇℃伅: %s %s"), + strText.Format(_T("鏂囦欢璺緞: %s%s\r\n绯荤粺淇℃伅: %s 浣 %s 鏍稿績 %s GB\r\n鍚姩淇℃伅: %s %s\r\n涓婄嚎淇℃伅: %s %d"), res[RES_PROGRAM_BITS].IsEmpty() ? "" : res[RES_PROGRAM_BITS] + " 浣 ", res[RES_FILE_PATH], - res[RES_SYSTEM_BITS], res[RES_SYSTEM_CPU], res[RES_SYSTEM_MEM], startTime, expired.c_str()); + res[RES_SYSTEM_BITS], res[RES_SYSTEM_CPU], res[RES_SYSTEM_MEM], startTime, expired.c_str(), + ctx->GetProtocol().c_str(), ctx->GetServerPort()); // 鑾峰彇榧犳爣浣嶇疆 CPoint pt; @@ -2644,7 +2649,7 @@ void CMy2015RemoteDlg::OnListClick(NMHDR* pNMHDR, LRESULT* pResult) m_pFloatingTip = new CWnd(); int width = res[RES_FILE_PATH].GetLength() * 10; width = min(max(width, 360), 800); - CRect rect(pt.x, pt.y, pt.x + width, pt.y + 50); // 瀹藉害銆侀珮搴 + CRect rect(pt.x, pt.y, pt.x + width, pt.y + 60); // 瀹藉害銆侀珮搴 BOOL bOk = m_pFloatingTip->CreateEx( WS_EX_TOPMOST | WS_EX_TOOLWINDOW | WS_EX_NOACTIVATE, diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 537a099..e0b6538 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -176,8 +176,8 @@ public: Buffer* m_ServerDLL[PAYLOAD_MAXTYPE]; Buffer* m_ServerBin[PAYLOAD_MAXTYPE]; MasterSettings m_settings; - static VOID CALLBACK NotifyProc(CONTEXT_OBJECT* ContextObject); - static VOID CALLBACK OfflineProc(CONTEXT_OBJECT* ContextObject); + static BOOL CALLBACK NotifyProc(CONTEXT_OBJECT* ContextObject); + static BOOL CALLBACK OfflineProc(CONTEXT_OBJECT* ContextObject); VOID MessageHandle(CONTEXT_OBJECT* ContextObject); VOID SendSelectedCommand(PBYTE szBuffer, ULONG ulLength); // 显示用户上线信息 diff --git a/server/2015Remote/BuildDlg.cpp b/server/2015Remote/BuildDlg.cpp index 7536f2c..34d5af4 100644 --- a/server/2015Remote/BuildDlg.cpp +++ b/server/2015Remote/BuildDlg.cpp @@ -73,6 +73,7 @@ void CBuildDlg::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX, IDC_STATIC_OTHER_ITEM, m_OtherItem); DDX_Control(pDX, IDC_COMBO_BITS, m_ComboBits); DDX_Control(pDX, IDC_COMBO_RUNTYPE, m_ComboRunType); + DDX_Control(pDX, IDC_COMBO_PROTO, m_ComboProto); } @@ -148,6 +149,7 @@ void CBuildDlg::OnBnClickedOk() CONNECT_ADDRESS g_ConnectAddress = { FLAG_FINDEN, "127.0.0.1", "", typ, false, DLL_VERSION, 0, startup, HeaderEncV1 }; g_ConnectAddress.SetServer(m_strIP, atoi(m_strPort)); g_ConnectAddress.runningType = m_ComboRunType.GetCurSel(); + g_ConnectAddress.protoType = m_ComboProto.GetCurSel(); if (!g_ConnectAddress.IsValid()) { SAFE_DELETE_ARRAY(szBuffer); @@ -257,6 +259,10 @@ BOOL CBuildDlg::OnInitDialog() m_ComboRunType.InsertString(RUNNING_PARALLEL, "并发上线"); m_ComboRunType.SetCurSel(RUNNING_RANDOM); + m_ComboProto.InsertString(PROTO_TCP, "TCP"); + m_ComboProto.InsertString(PROTO_UDP, "UDP"); + m_ComboProto.SetCurSel(PROTO_TCP); + m_OtherItem.ShowWindow(SW_HIDE); return TRUE; // return TRUE unless you set the focus to a control diff --git a/server/2015Remote/BuildDlg.h b/server/2015Remote/BuildDlg.h index 1575c3a..0954fcf 100644 --- a/server/2015Remote/BuildDlg.h +++ b/server/2015Remote/BuildDlg.h @@ -33,4 +33,5 @@ public: CStatic m_OtherItem; CComboBox m_ComboBits; CComboBox m_ComboRunType; + CComboBox m_ComboProto; }; diff --git a/server/2015Remote/IOCPServer.cpp b/server/2015Remote/IOCPServer.cpp index ac0055c..005ea96 100644 --- a/server/2015Remote/IOCPServer.cpp +++ b/server/2015Remote/IOCPServer.cpp @@ -149,6 +149,7 @@ IOCPServer::~IOCPServer(void) // 返回错误码0代表成功,否则代表错误信息. UINT IOCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort) { + m_nPort = uPort; m_NotifyProc = NotifyProc; m_OfflineProc = OffProc; m_hKillEvent = CreateEvent(NULL,FALSE,FALSE,NULL); @@ -448,6 +449,7 @@ BOOL IOCPServer::OnClientInitializing(PCONTEXT_OBJECT ContextObject, DWORD dwTr // May be this function should be a member of `CONTEXT_OBJECT`. BOOL ParseReceivedData(CONTEXT_OBJECT * ContextObject, DWORD dwTrans, pfnNotifyProc m_NotifyProc) { + BOOL ret = 1; try { if (dwTrans == 0) //对方关闭了套接字 @@ -475,7 +477,8 @@ BOOL ParseReceivedData(CONTEXT_OBJECT * ContextObject, DWORD dwTrans, pfnNotifyP ULONG ulOriginalLength = 0; PBYTE CompressedBuffer = ContextObject->ReadBuffer(ulCompressedLength, ulOriginalLength); ContextObject->InDeCompressedBuffer.WriteBuffer(CompressedBuffer, ulCompressedLength); - m_NotifyProc(ContextObject); + if (m_NotifyProc(ContextObject)) + ret = 999; break; } @@ -496,7 +499,8 @@ BOOL ParseReceivedData(CONTEXT_OBJECT * ContextObject, DWORD dwTrans, pfnNotifyP ContextObject->InDeCompressedBuffer.ClearBuffer(); ContextObject->Decode(CompressedBuffer, ulOriginalLength); ContextObject->InDeCompressedBuffer.WriteBuffer(CompressedBuffer, ulOriginalLength); - m_NotifyProc(ContextObject); + if (m_NotifyProc(ContextObject)) + ret = 999; SAFE_DELETE_ARRAY(CompressedBuffer); continue; } @@ -510,7 +514,8 @@ BOOL ParseReceivedData(CONTEXT_OBJECT * ContextObject, DWORD dwTrans, pfnNotifyP ContextObject->InDeCompressedBuffer.ClearBuffer(); ContextObject->Decode(DeCompressedBuffer, ulOriginalLength); ContextObject->InDeCompressedBuffer.WriteBuffer(DeCompressedBuffer, ulOriginalLength); - m_NotifyProc(ContextObject); //通知窗口 + if (m_NotifyProc(ContextObject)) + ret = 999; }else if (usingZstd){ // 尝试用zlib解压缩 if (Z_OK == uncompress(DeCompressedBuffer, &ulOriginalLength, CompressedBuffer, ulCompressedLength)) { @@ -518,7 +523,8 @@ BOOL ParseReceivedData(CONTEXT_OBJECT * ContextObject, DWORD dwTrans, pfnNotifyP ContextObject->InDeCompressedBuffer.ClearBuffer(); ContextObject->Decode(DeCompressedBuffer, ulOriginalLength); ContextObject->InDeCompressedBuffer.WriteBuffer(DeCompressedBuffer, ulOriginalLength); - m_NotifyProc(ContextObject); + if (m_NotifyProc(ContextObject)) + ret = 999; } else { zlibFailed = true; ContextObject->CompressMethod = COMPRESS_UNKNOWN; @@ -542,7 +548,7 @@ BOOL ParseReceivedData(CONTEXT_OBJECT * ContextObject, DWORD dwTrans, pfnNotifyP ContextObject->InCompressedBuffer.ClearBuffer(); ContextObject->InDeCompressedBuffer.ClearBuffer(); } - return TRUE; + return ret; } BOOL IOCPServer::OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans) diff --git a/server/2015Remote/IOCPServer.h b/server/2015Remote/IOCPServer.h index e8191c6..76b2f56 100644 --- a/server/2015Remote/IOCPServer.h +++ b/server/2015Remote/IOCPServer.h @@ -47,9 +47,8 @@ class IOCPServer : public Server { - typedef void (CALLBACK* pfnNotifyProc)(CONTEXT_OBJECT* ContextObject); - typedef void (CALLBACK* pfnOfflineProc)(CONTEXT_OBJECT* ContextObject); protected: + int m_nPort; SOCKET m_sListenSocket; HANDLE m_hCompletionPort; UINT m_ulMaxConnections; @@ -103,6 +102,9 @@ private: public: IOCPServer(void); ~IOCPServer(void); + int GetPort() const override { + return m_nPort; + } UINT StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort); diff --git a/server/2015Remote/IOCPUDPServer.cpp b/server/2015Remote/IOCPUDPServer.cpp index 3104215..bcdca11 100644 --- a/server/2015Remote/IOCPUDPServer.cpp +++ b/server/2015Remote/IOCPUDPServer.cpp @@ -15,7 +15,7 @@ IOCPUDPServer::~IOCPUDPServer() { UINT IOCPUDPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort) { if (m_running) return 1; - + m_port = uPort; m_notify = NotifyProc; m_offline = OffProc; @@ -50,14 +50,8 @@ UINT IOCPUDPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc void IOCPUDPServer::PostRecv() { if (!m_running) return; - AddCount(1); - CONTEXT_UDP* ctx = new CONTEXT_UDP(); - ctx->InitMember(m_socket, this); - - IO_CONTEXT* ioCtx = new IO_CONTEXT(); - ZeroMemory(&ioCtx->ol, sizeof(OVERLAPPED)); - ioCtx->pContext = ctx; - + IO_CONTEXT* ioCtx = AddCount(); + CONTEXT_UDP* ctx = ioCtx->pContext; ctx->wsaInBuf.buf = ctx->szBuffer; ctx->wsaInBuf.len = sizeof(ctx->szBuffer); @@ -78,8 +72,7 @@ void IOCPUDPServer::PostRecv() { DWORD err = WSAGetLastError(); Mprintf("[IOCP] PostRecv error: %d\n", err); delete ioCtx; - delete ctx; - AddCount(-1); + DelCount(); } } @@ -95,9 +88,8 @@ void IOCPUDPServer::WorkerThread() { Mprintf("[IOCP] PostRecv error: %d\n", err); if (pOverlapped) { IO_CONTEXT* ioCtx = CONTAINING_RECORD(pOverlapped, IO_CONTEXT, ol); - delete ioCtx->pContext; delete ioCtx; - AddCount(-1); + DelCount(); } continue; } @@ -105,14 +97,19 @@ void IOCPUDPServer::WorkerThread() { IO_CONTEXT* ioCtx = CONTAINING_RECORD(pOverlapped, IO_CONTEXT, ol); CONTEXT_UDP* ctx = ioCtx->pContext; - ParseReceivedData(ctx, bytes, m_notify); + BOOL ret = ParseReceivedData(ctx, bytes, m_notify); + if (999 != ret) + ctx->Destroy(); // 释放 + ioCtx->pContext = NULL; delete ioCtx; - AddCount(-1); + DelCount(); PostRecv(); // 继续提交 } + CloseHandle(m_hThread); + m_hThread = NULL; } VOID IOCPUDPServer::Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) { @@ -157,8 +154,8 @@ VOID IOCPUDPServer::Destroy() { if (m_hThread) { WaitForSingleObject(m_hThread, INFINITE); - CloseHandle(m_hThread); - m_hThread = NULL; + while (m_hThread) + Sleep(200); } if (m_hIOCP) { diff --git a/server/2015Remote/IOCPUDPServer.h b/server/2015Remote/IOCPUDPServer.h index df834d6..497af77 100644 --- a/server/2015Remote/IOCPUDPServer.h +++ b/server/2015Remote/IOCPUDPServer.h @@ -6,10 +6,21 @@ class IOCPUDPServer : public Server { + struct IO_CONTEXT { + OVERLAPPED ol; + CONTEXT_UDP* pContext; + IO_CONTEXT(CONTEXT_UDP* ctx) : ol({}), pContext(ctx) { } + ~IO_CONTEXT() { + SAFE_DELETE(pContext); + } + }; public: IOCPUDPServer(); ~IOCPUDPServer(); + int GetPort() const override { + return m_port; + } UINT StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort) override; VOID Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) override; VOID Destroy() override; @@ -17,9 +28,17 @@ public: private: void WorkerThread(); void PostRecv(); - void AddCount(int n=1){ + IO_CONTEXT* AddCount(){ m_locker.lock(); - m_count += n; + IO_CONTEXT* ioCtx = new IO_CONTEXT(new CONTEXT_UDP()); + ioCtx->pContext->InitMember(m_socket, this); + m_count++; + m_locker.unlock(); + return ioCtx; + } + void DelCount() { + m_locker.lock(); + m_count--; m_locker.unlock(); } int GetCount() { @@ -29,6 +48,7 @@ private: return n; } private: + int m_port = 6543; int m_count = 0; CLocker m_locker; SOCKET m_socket = INVALID_SOCKET; @@ -38,9 +58,4 @@ private: pfnNotifyProc m_notify = nullptr; pfnOfflineProc m_offline = nullptr; - - struct IO_CONTEXT { - OVERLAPPED ol; - CONTEXT_UDP* pContext; - }; }; diff --git a/server/2015Remote/Server.h b/server/2015Remote/Server.h index ab159b9..1788b87 100644 --- a/server/2015Remote/Server.h +++ b/server/2015Remote/Server.h @@ -64,7 +64,12 @@ class HeaderParser { friend class CONTEXT_OBJECT; protected: HeaderParser() { - memset(this, 0, sizeof(HeaderParser)); + m_Encoder = nullptr; + m_Encoder2 = nullptr; + m_bParsed = FALSE; + m_nHeaderLen = m_nCompareLen = m_nFlagLen = 0; + m_nFlagType = FLAG_UNKNOWN; + memset(m_szPacketFlag, 0, sizeof(m_szPacketFlag)); } virtual ~HeaderParser() { Reset(); @@ -112,6 +117,8 @@ protected: m_nFlagLen = m_nCompareLen; m_nHeaderLen = m_nFlagLen + 8; m_bParsed = TRUE; + assert(NULL==m_Encoder); + assert(NULL==m_Encoder2); m_Encoder = new Encoder(); m_Encoder2 = new Encoder(); break; @@ -156,7 +163,10 @@ protected: HeaderParser& Reset() { SAFE_DELETE(m_Encoder); SAFE_DELETE(m_Encoder2); - memset(this, 0, sizeof(HeaderParser)); + m_bParsed = FALSE; + m_nHeaderLen = m_nCompareLen = m_nFlagLen = 0; + m_nFlagType = FLAG_UNKNOWN; + memset(m_szPacketFlag, 0, sizeof(m_szPacketFlag)); return *this; } BOOL IsParsed() const { @@ -187,8 +197,8 @@ private: int m_nFlagLen; // 标识长度 FlagType m_nFlagType; // 标识类型 char m_szPacketFlag[32]; // 对比信息 - Encoder* m_Encoder; // 编码器 - Encoder* m_Encoder2; // 编码器2 + Encoder* m_Encoder; // 编码器 + Encoder* m_Encoder2; // 编码器2 }; enum IOType @@ -229,8 +239,8 @@ public: } }; -typedef void (CALLBACK* pfnNotifyProc)(CONTEXT_OBJECT* ContextObject); -typedef void (CALLBACK* pfnOfflineProc)(CONTEXT_OBJECT* ContextObject); +typedef BOOL (CALLBACK* pfnNotifyProc)(CONTEXT_OBJECT* ContextObject); +typedef BOOL (CALLBACK* pfnOfflineProc)(CONTEXT_OBJECT* ContextObject); class Server { @@ -240,6 +250,8 @@ public: Server() {} virtual ~Server() {} + virtual int GetPort() const = 0; + virtual UINT StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort) = 0; virtual void Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) = 0; @@ -261,6 +273,8 @@ public: virtual uint64_t GetClientID() const = 0; virtual std::string GetPeerName() const = 0; virtual int GetPort() const = 0; + virtual std::string GetProtocol() const = 0; + virtual int GetServerPort() const = 0; public: virtual ~context() {} @@ -298,6 +312,12 @@ public: std::string PeerName; // 对端IP Server* server; // 所属服务端 + std::string GetProtocol() const override { + return "TCP"; + } + int GetServerPort() const override { + return server->GetPort(); + } VOID InitMember(SOCKET s, Server *svr) { memset(szBuffer, 0, sizeof(char) * PACKET_LENGTH); @@ -462,6 +482,9 @@ public: int addrLen; sockaddr_in clientAddr; + std::string GetProtocol() const override { + return "UDP"; + } VOID InitMember(SOCKET s, Server* svr) override { CONTEXT_OBJECT::InitMember(s, svr); clientAddr = {}; diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index e42291d6c66ed4534c59d707d7cfacf600e81017..6402d52af4eba34043cd51bb643b502affeb1a58 100644 GIT binary patch delta 447 zcmXYtF-QV&7{xt1EW*S@j^jMf6Hg@(%hOE4#6qm8#KIw{ED9os3L*maJcX7f^+8jE zH8=-FG}?InEN= zjS|D%6i@VzlEUneh3Ki03^8S_z5cx%mLlB~qMOA@4 dx;fo~wy#@r^7RwzWujsb@P5kF8&>Q#vcJp6oTdN( delta 267 zcmcb0lIhq%rVY!gS&bMB8B8Y|y2($zQ!O@Gq{d-#L5ewbbHHtvE2C`sd=QN5T z*bwu{iox=e6