Files
wnmj/Servers/服务器组件/内核引擎/TCPSocketService.cpp

728 lines
18 KiB
C++
Raw Normal View History

2026-02-13 14:34:15 +08:00
#include "StdAfx.h"
#include "TraceService.h"
#include "TCPSocketService.h"
//<2F><EFBFBD><EAB6A8>
#define ID_SOCKET_WND 10 //SOCKET <20><><EFBFBD><EFBFBD> ID
#define WM_SOCKET_NOTIFY WM_USER+10 //SOCKET <20><>Ϣ
//////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CTCPSocketService, CWnd)
ON_MESSAGE(WM_SOCKET_NOTIFY, OnSocketNotify)
END_MESSAGE_MAP()
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CTCPSocketService::CTCPSocketService(void)
{
//<2F>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
m_cbSendRound = 0;
m_cbRecvRound = 0;
m_dwSendXorKey = 0;
m_dwRecvXorKey = 0;
m_hSocket = INVALID_SOCKET;
m_dwSendTickCount = 0;
m_dwRecvTickCount = 0;
m_dwSendPacketCount = 0;
m_dwRecvPacketCount = 0;
m_wServiceID = 0;
m_cbSocketStatus = SOCKET_STATUS_IDLE;
m_wRecvSize = 0;
m_dwServerIP = INADDR_NONE;
m_wPort = 0;
m_bSuccess = false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CTCPSocketService::~CTCPSocketService(void)
{
if (m_bService)
ConcludeService();
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
//////////////////////////////////////////////////////////////////////////
//<2F>ӿڲ<D3BF>ѯ
void * CTCPSocketService::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(ITCPSocketService, Guid, dwQueryVer);
QUERYINTERFACE(IQueueServiceSink, Guid, dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(ITCPSocketService, Guid, dwQueryVer);
return NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CTCPSocketService::StartService()
{
//Ч<><D0A7>״̬
if (m_bService == true)
{
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), TraceLevel_Warning);
return true;
}
//<2F>󶨶<EFBFBD><F3B6A8B6><EFBFBD>
if (m_QueueService.SetQueueServiceSink(QUERY_ME_INTERFACE(IUnknownEx)) == false)
{
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>"), TraceLevel_Exception);
return false;
}
try
{
//<2F>󶨶<EFBFBD><F3B6A8B6><EFBFBD>
if (m_QueueService.SetQueueServiceSink(QUERY_ME_INTERFACE(IUnknownEx)) == false)
{
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>"), TraceLevel_Exception);
return false;
}
// m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// if (m_hSocket == INVALID_SOCKET) return false;
if ((m_hWnd == NULL) && (!Create(NULL, NULL, WS_CHILD, CRect(0, 0, 0, 0), GetDesktopWindow(), ID_SOCKET_WND, NULL)))
return false;
if (m_QueueService.StartService())
{
m_bService = true;
}
}
catch (LPCTSTR pszError)
{
CTraceService::TraceString(pszError, TraceLevel_Exception);
return false;
}
return m_bService;
}
//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
bool CTCPSocketService::ConcludeService()
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bService = false;
if (m_hSocket != INVALID_SOCKET)
{
closesocket(m_hSocket);
WSAAsyncSelect(m_hSocket, GetSafeHwnd(), WM_SOCKET_NOTIFY, 0);
m_hSocket = INVALID_SOCKET;
}
//<2F>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
m_cbSendRound = 0;
m_cbRecvRound = 0;
m_dwSendXorKey = 0;
m_dwRecvXorKey = 0;
m_hSocket = INVALID_SOCKET;
m_dwSendTickCount = 0;
m_dwRecvTickCount = 0;
m_dwSendPacketCount = 0;
m_dwRecvPacketCount = 0;
m_cbSocketStatus = SOCKET_STATUS_IDLE;
m_wRecvSize = 0;
m_dwServerIP = INADDR_NONE;
m_wPort = 0;
m_bSuccess = false;
m_QueueServiceEvent.SetQueueServiceSink(NULL);
m_QueueService.ConcludeService();
return true;
}
//<2F><><EFBFBD>ýӿ<C3BD>
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
bool CTCPSocketService::SetServiceID(WORD wServiceID)
{
m_wServiceID = wServiceID;
return true;
}
//<2F><><EFBFBD>ýӿ<C3BD>
bool CTCPSocketService::SetTCPSocketEvent(IUnknownEx * pIUnknownEx)
{
//״̬<D7B4>ж<EFBFBD>
if (m_bService == true)
{
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>󶨲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), TraceLevel_Warning);
return false;
}
//<2F><><EFBFBD>ýӿ<C3BD>
if (m_QueueServiceEvent.SetQueueServiceSink(pIUnknownEx) == false)
{
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>"), TraceLevel_Warning);
return false;
}
return true;
}
//<2F><><EFBFBD>ܽӿ<DCBD>
//////////////////////////////////////////////////////////////////////////
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bool CTCPSocketService::CloseSocket()
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bool bClose = (m_hSocket != INVALID_SOCKET);
if (bClose)
return m_QueueService.AddToQueue(QUEUE_SAFE_CLOSE, NULL, 0);
//<2F>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
m_cbSendRound = 0;
m_cbRecvRound = 0;
m_dwSendXorKey = 0;
m_dwRecvXorKey = 0;
m_hSocket = INVALID_SOCKET;
m_dwSendTickCount = 0;
m_dwRecvTickCount = 0;
m_dwSendPacketCount = 0;
m_dwRecvPacketCount = 0;
m_cbSocketStatus = SOCKET_STATUS_IDLE;
m_wRecvSize = 0;
m_dwServerIP = INADDR_NONE;
m_wPort = 0;
return true;
}
//<2F><><EFBFBD>ӵ<EFBFBD>ַ
bool CTCPSocketService::Connect(DWORD dwServerIP, WORD wPort)
{
if (m_bSuccess && ntohl(dwServerIP) == m_dwTempServerIP)//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BUG --
m_dwServerIP = ntohl(dwServerIP);
else m_dwServerIP = dwServerIP;
m_wPort = wPort;
m_dwTempServerIP = m_dwServerIP;
//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
m_cbSendRound = 0;
m_cbRecvRound = 0;
m_dwSendXorKey = 0x12345678;
m_dwRecvXorKey = 0x12345678;
try
{
return m_QueueService.AddToQueue(QUEUE_CONNECT_REQUEST, NULL, 0);
}
catch (LPCTSTR pszError)
{
CloseSocket(SHUT_REASON_EXCEPTION);
throw pszError;
}
catch (...)
{
CloseSocket(SHUT_REASON_EXCEPTION);
throw TEXT("<EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD>δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
return false;
}
//<2F><><EFBFBD>ӵ<EFBFBD>ַ
bool CTCPSocketService::Connect(LPCTSTR szServerIP, WORD wPort)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(wPort != 0);
ASSERT(szServerIP != NULL);
if ((szServerIP == NULL) || (wPort == 0)) return false;
return Connect(TranslateAddr(szServerIP), wPort);
}
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
bool CTCPSocketService::SendData(WORD wMainCmdID, WORD wSubCmdID)
{
//Ч<><D0A7>״̬
if (m_hSocket == INVALID_SOCKET) return false;
if (m_cbSocketStatus != SOCKET_STATUS_CONNECT) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbDataBuffer[SOCKET_TCP_BUFFER];
TCP_Head * pHead = (TCP_Head *)cbDataBuffer;
pHead->CommandInfo.wMainCmdID = wMainCmdID;
pHead->CommandInfo.wSubCmdID = wSubCmdID;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wSendSize = EncryptBuffer(cbDataBuffer, sizeof(TCP_Head), sizeof(cbDataBuffer));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return SendDataBuffer(cbDataBuffer, wSendSize);
}
//֪ͨ<CDA8>ص<EFBFBD>
void CTCPSocketService::OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize)
{
switch (wIdentifier)
{
case QUEUE_SEND_REQUEST:
{
ASSERT(pBuffer);
ASSERT(wDataSize > 0);
if (!pBuffer || wDataSize <= 0) return;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wSended = 0;
while (wSended < wDataSize)
{
int iErrorCode = send(m_hSocket, (char *)pBuffer + wSended, wDataSize - wSended, 0);
if (iErrorCode == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAEWOULDBLOCK)
{
return;
}
return;
}
wSended += iErrorCode;
}
break;
}
case QUEUE_CONNECT_REQUEST:
{
//Ч<><D0A7>״̬
if (m_dwServerIP == INADDR_NONE) throw TEXT("Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴγ<EFBFBD><EFBFBD>ԣ<EFBFBD>");
if (m_wPort == 0) throw TEXT("Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴγ<EFBFBD><EFBFBD>ԣ<EFBFBD>");
//<2F><><EFBFBD><EFBFBD> SOCKET
m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hSocket == INVALID_SOCKET) throw TEXT("SOCKET <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>");
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(m_hSocket != INVALID_SOCKET);
ASSERT(m_cbSocketStatus == SOCKET_STATUS_IDLE);
int iErrorCode = WSAAsyncSelect(m_hSocket, m_hWnd, WM_SOCKET_NOTIFY, FD_READ | FD_CONNECT | FD_CLOSE);
if (iErrorCode == SOCKET_ERROR) throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>");
//<2F><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
SOCKADDR_IN SocketAddr;
memset(&SocketAddr, 0, sizeof(SocketAddr));
SocketAddr.sin_family = AF_INET;
SocketAddr.sin_port = htons(m_wPort);
SocketAddr.sin_addr.S_un.S_addr = m_dwServerIP;
iErrorCode = connect(m_hSocket, (sockaddr*) & SocketAddr, sizeof(sockaddr));
if (SOCKET_ERROR == iErrorCode)
iErrorCode = WSAGetLastError();
break;
}
case QUEUE_SAFE_CLOSE:
{
if (m_hSocket != INVALID_SOCKET)
{
closesocket(m_hSocket);
WSAAsyncSelect(m_hSocket, GetSafeHwnd(), WM_SOCKET_NOTIFY, 0);
m_hSocket = INVALID_SOCKET;
}
//<2F>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
m_cbSendRound = 0;
m_cbRecvRound = 0;
m_dwSendXorKey = 0;
m_dwRecvXorKey = 0;
m_hSocket = INVALID_SOCKET;
m_dwSendTickCount = 0;
m_dwRecvTickCount = 0;
m_dwSendPacketCount = 0;
m_dwRecvPacketCount = 0;
m_cbSocketStatus = SOCKET_STATUS_IDLE;
m_wRecvSize = 0;
m_dwServerIP = INADDR_NONE;
m_wPort = 0;
break;
}
case QUEUE_DETECT_SOCKET:
{
}
default:
{
ASSERT(FALSE);
return;
}
}
}
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
bool CTCPSocketService::SendData(WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
{
//Ч<><D0A7>״̬
if (m_hSocket == INVALID_SOCKET) return false;
// if (m_cbSocketStatus != SOCKET_STATUS_CONNECT) return false;
//Ч<><D0A7><EFBFBD><EFBFBD>С
ASSERT(wDataSize <= SOCKET_TCP_BUFFER);
if (wDataSize > SOCKET_TCP_BUFFER) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbDataBuffer[SOCKET_TCP_BUFFER];
TCP_Head * pHead = (TCP_Head *)cbDataBuffer;
pHead->CommandInfo.wMainCmdID = wMainCmdID;
pHead->CommandInfo.wSubCmdID = wSubCmdID;
if (wDataSize > 0)
{
ASSERT(pData != NULL);
CopyMemory(pHead + 1, pData, wDataSize);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wSendSize = EncryptBuffer(cbDataBuffer, sizeof(TCP_Head) + wDataSize, sizeof(cbDataBuffer));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return SendDataBuffer(cbDataBuffer, wSendSize);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CTCPSocketService::SendDataBuffer(void * pBuffer, WORD wSendSize)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(wSendSize != 0);
ASSERT(pBuffer != NULL);
if (NULL == pBuffer || 0 == wSendSize) return false;
return m_QueueService.AddToQueue(QUEUE_SEND_REQUEST, pBuffer, wSendSize);
}
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
VOID CTCPSocketService::CloseSocket(BYTE cbShutReason)
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
m_QueueServiceEvent.PostTCPSocketShutEvent(m_wServiceID, cbShutReason);
CloseSocket();
}
//<2F><><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
DWORD CTCPSocketService::TranslateAddr(LPCTSTR pszServerAddr)
{
//ת<><D7AA><EFBFBD><EFBFBD>ַ
DWORD dwServerIP = inet_addr((LPCSTR)CT2A(pszServerAddr));
if (dwServerIP == INADDR_NONE)
{
LPHOSTENT lpHost = gethostbyname((LPCSTR)CT2A(pszServerAddr));
if (lpHost == NULL) return INADDR_NONE;
dwServerIP = ((LPIN_ADDR)lpHost->h_addr)->s_addr;
}
return dwServerIP;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD CTCPSocketService::EncryptBuffer(BYTE pcbDataBuffer[], WORD wDataSize, WORD wBufferSize)
{
int i = 0;
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(wDataSize >= sizeof(TCP_Head));
ASSERT(wBufferSize >= (wDataSize + 2*sizeof(DWORD)));
ASSERT(wDataSize <= (sizeof(TCP_Head) + SOCKET_TCP_BUFFER));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wEncryptSize = wDataSize - sizeof(TCP_Command), wSnapCount = 0;
if ((wEncryptSize % sizeof(DWORD)) != 0)
{
wSnapCount = sizeof(DWORD) - wEncryptSize % sizeof(DWORD);
memset(pcbDataBuffer + sizeof(TCP_Info) + wEncryptSize, 0, wSnapCount);
}
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>ӳ<EFBFBD><D3B3>
BYTE cbCheckCode = 0;
for (WORD i = sizeof(TCP_Info); i < wDataSize; i++)
{
cbCheckCode += pcbDataBuffer[i];
pcbDataBuffer[i] = MapSendByte(pcbDataBuffer[i]);
}
//<2F><>д<EFBFBD><D0B4>Ϣͷ
TCP_Head * pHead = (TCP_Head *)pcbDataBuffer;
pHead->TCPInfo.cbCheckCode = ~cbCheckCode + 1;
pHead->TCPInfo.wPacketSize = wDataSize;
//pHead->TCPInfo.cbVersion = SOCKET_TCP_VER;
pHead->TCPInfo.cbDataKind = DK_MAPPED;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ
//DWORD dwXorKey = m_dwSendXorKey;
//if (m_dwSendPacketCount == 0)
//{
// //<2F><><EFBFBD>ɵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// GUID Guid;
// CoCreateGuid(&Guid);
// dwXorKey = GetTickCount() * GetTickCount();
// dwXorKey ^= Guid.Data1;
// dwXorKey ^= Guid.Data2;
// dwXorKey ^= Guid.Data3;
// dwXorKey ^= *((DWORD *)Guid.Data4);
// //<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// dwXorKey = SeedRandMap((WORD)dwXorKey);
// dwXorKey |= ((DWORD)SeedRandMap((WORD)(dwXorKey >> 16))) << 16;
// dwXorKey ^= g_dwPacketKey;
// m_dwSendXorKey = dwXorKey;
// m_dwRecvXorKey = dwXorKey;
//}
////<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//WORD * pwSeed = (WORD *)(pcbDataBuffer + sizeof(TCP_Info));
//DWORD * pdwXor = (DWORD *)(pcbDataBuffer + sizeof(TCP_Info));
//WORD wEncrypCount = (wEncryptSize + wSnapCount) / sizeof(DWORD);
//for (WORD i = 0; i < wEncrypCount; i++)
//{
// *pdwXor++ ^= dwXorKey;
// dwXorKey = SeedRandMap(*pwSeed++);
// dwXorKey |= ((DWORD)SeedRandMap(*pwSeed++)) << 16;
// dwXorKey ^= g_dwPacketKey;
//}
////<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ
//if (m_dwSendPacketCount == 0)
//{
// MoveMemory(pcbDataBuffer + sizeof(TCP_Head) + sizeof(DWORD), pcbDataBuffer + sizeof(TCP_Head), wDataSize);
// *((DWORD *)(pcbDataBuffer + sizeof(TCP_Head))) = m_dwSendXorKey;
// pHead->TCPInfo.wPacketSize += sizeof(DWORD);
// wDataSize += sizeof(DWORD);
//}
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_dwSendPacketCount++;
//m_dwSendXorKey = dwXorKey;
return wDataSize;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD CTCPSocketService::CrevasseBuffer(BYTE pcbDataBuffer[], WORD wDataSize)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(m_dwSendPacketCount > 0);
ASSERT(wDataSize >= sizeof(TCP_Head));
ASSERT(((TCP_Head *)pcbDataBuffer)->TCPInfo.wPacketSize == wDataSize);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wSnapCount = 0;
if ((wDataSize % sizeof(DWORD)) != 0)
{
wSnapCount = sizeof(DWORD) - wDataSize % sizeof(DWORD);
memset(pcbDataBuffer + wDataSize, 0, wSnapCount);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*DWORD dwXorKey = m_dwRecvXorKey;
DWORD * pdwXor = (DWORD *)(pcbDataBuffer + sizeof(TCP_Info));
WORD * pwSeed = (WORD *)(pcbDataBuffer + sizeof(TCP_Info));
WORD wEncrypCount = (wDataSize + wSnapCount - sizeof(TCP_Info)) / 4;
for (WORD i = 0; i < wEncrypCount; i++)
{
if ((i == (wEncrypCount - 1)) && (wSnapCount > 0))
{
BYTE * pcbKey = ((BYTE *) & m_dwRecvXorKey) + sizeof(DWORD) - wSnapCount;
CopyMemory(pcbDataBuffer + wDataSize, pcbKey, wSnapCount);
}
dwXorKey = SeedRandMap(*pwSeed++);
dwXorKey |= ((DWORD)SeedRandMap(*pwSeed++)) << 16;
dwXorKey ^= g_dwPacketKey;
*pdwXor++ ^= m_dwRecvXorKey;
m_dwRecvXorKey = dwXorKey;
}
*/
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>ӳ<EFBFBD><D3B3>
TCP_Head * pHead = (TCP_Head *)pcbDataBuffer;
BYTE cbCheckCode = pHead->TCPInfo.cbCheckCode;
for (int i = sizeof(TCP_Info); i < wDataSize; i++)
{
pcbDataBuffer[i] = MapRecvByte(pcbDataBuffer[i]);
cbCheckCode += pcbDataBuffer[i];
}
if (cbCheckCode != 0) throw TEXT("<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
return wDataSize;
}
//<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>
WORD CTCPSocketService::SeedRandMap(WORD wSeed)
{
DWORD dwHold = wSeed;
return (WORD)((dwHold = dwHold * 241103L + 2533101L) >> 16);
}
//ӳ<><EFBFBD><E4B7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE CTCPSocketService::MapSendByte(BYTE const cbData)
{
/*BYTE cbMap = g_SendByteMap[(BYTE)(cbData+m_cbSendRound)];
m_cbSendRound += 3;*/
BYTE cbMap = g_SendByteMap[(BYTE)(cbData)];
return cbMap;
}
//ӳ<><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE CTCPSocketService::MapRecvByte(BYTE const cbData)
{
//BYTE cbMap = g_RecvByteMap[cbData] - m_cbRecvRound;
//m_cbRecvRound += 3;
BYTE cbMap = g_RecvByteMap[cbData];
return cbMap;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LRESULT CTCPSocketService::OnSocketNotifyConnect(WPARAM wParam, LPARAM lParam)
{
//<2F>ж<EFBFBD>״̬
int iErrorCode = WSAGETSELECTERROR(lParam);
if (iErrorCode == 0)
{
m_cbSocketStatus = SOCKET_STATUS_CONNECT;
m_bSuccess = true;
//<2F><><EFBFBD><EFBFBD>֪ͨ
m_QueueServiceEvent.PostTCPSocketLinkEvent(m_wServiceID, iErrorCode);
}
else CloseSocket(SHUT_REASON_TIME_OUT);
return 1;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ
LRESULT CTCPSocketService::OnSocketNotifyRead(WPARAM wParam, LPARAM lParam)
{
try
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
int iRetCode = recv(m_hSocket, (char *)m_cbRecvBuf + m_wRecvSize, sizeof(m_cbRecvBuf) - m_wRecvSize, 0);
if (iRetCode == SOCKET_ERROR) throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹرգ<EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>");
ASSERT(m_dwSendPacketCount > 0);
m_wRecvSize += iRetCode;
m_dwRecvTickCount = GetTickCount() / 1000L;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wPacketSize = 0;
BYTE cbDataBuffer[SOCKET_TCP_BUFFER+sizeof(TCP_Head)];
TCP_Head * pHead = (TCP_Head *)m_cbRecvBuf;
while (m_wRecvSize >= sizeof(TCP_Head))
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wPacketSize = pHead->TCPInfo.wPacketSize;
ASSERT(pHead->TCPInfo.cbDataKind == DK_MAPPED);
//ASSERT(pHead->TCPInfo.cbVersion == SOCKET_TCP_VER);
ASSERT(wPacketSize <= (SOCKET_TCP_BUFFER + sizeof(TCP_Head)));
//if (pHead->TCPInfo.cbVersion != SOCKET_TCP_VER) throw TEXT("<22><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><E6B1BE><EFBFBD><EFBFBD>");
if (pHead->TCPInfo.cbDataKind != DK_MAPPED) throw TEXT("<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
if (wPacketSize > (SOCKET_TCP_BUFFER + sizeof(TCP_Head))) throw TEXT("<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>̫<EFBFBD><EFBFBD>");
if (m_wRecvSize < wPacketSize) return 1;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_dwRecvPacketCount++;
CopyMemory(cbDataBuffer, m_cbRecvBuf, wPacketSize);
m_wRecvSize -= wPacketSize;
MoveMemory(m_cbRecvBuf, m_cbRecvBuf + wPacketSize, m_wRecvSize);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wRealySize = CrevasseBuffer(cbDataBuffer, wPacketSize);
ASSERT(wRealySize >= sizeof(TCP_Head));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wDataSize = wRealySize - sizeof(TCP_Head);
void * pDataBuffer = cbDataBuffer + sizeof(TCP_Head);
TCP_Command Command = ((TCP_Head *)cbDataBuffer)->CommandInfo;
//<2F>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD>
if (Command.wMainCmdID == MDM_KN_COMMAND)
{
switch (Command.wSubCmdID)
{
case SUB_KN_DETECT_SOCKET: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SendData(MDM_KN_COMMAND, SUB_KN_DETECT_SOCKET, pDataBuffer, wDataSize);
break;
}
}
continue;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool bSuccess = m_QueueServiceEvent.PostTCPSocketReadEvent(m_wServiceID, Command, pDataBuffer, wDataSize);
if ( !bSuccess )
{
CString strTmp;
strTmp.Format(_T("MainID: %d SubID: %d DataSize: %d"), Command.wMainCmdID, Command.wSubCmdID, wDataSize);
TRACE(strTmp);
throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>");
}
}
}
catch ( TCHAR *e )
{
TRACE(e);
CloseSocket(SHUT_REASON_EXCEPTION);
}
catch (...)
{
TRACE(_T("δ֪<EFBFBD>"));
CloseSocket(SHUT_REASON_EXCEPTION);
}
return 1;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>
LRESULT CTCPSocketService::OnSocketNotifyClose(WPARAM wParam, LPARAM lParam)
{
CloseSocket(SHUT_REASON_REMOTE);
return 1;
}
//SOCKET <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LRESULT CTCPSocketService::OnSocketNotify(WPARAM wParam, LPARAM lParam)
{
switch (WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return OnSocketNotifyConnect(wParam, lParam);
}
case FD_READ: //<2F><><EFBFBD>ݶ<EFBFBD>ȡ
{
return OnSocketNotifyRead(wParam, lParam);
}
case FD_CLOSE: //<2F><><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>
{
return OnSocketNotifyClose(wParam, lParam);
}
}
return 0;
}
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern "C" __declspec(dllexport) void * CreateTCPSocketService(const GUID & Guid, DWORD dwInterfaceVer)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CTCPSocketService * pTCPSocketService = NULL;
try
{
pTCPSocketService = new CTCPSocketService();
if (pTCPSocketService == NULL) throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>");
void * pObject = pTCPSocketService->QueryInterface(Guid, dwInterfaceVer);
if (pObject == NULL) throw TEXT("<EFBFBD>ӿڲ<EFBFBD>ѯʧ<EFBFBD><EFBFBD>");
return pObject;
}
catch (...) {}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SafeDelete(pTCPSocketService);
return NULL;
}